【问题标题】:Load array and display based on state of uiswitch根据uiswitch的状态加载数组并显示
【发布时间】:2014-03-23 20:24:28
【问题描述】:

我正在尝试开发一个显示随机真理或敢于类型问题的应用程序,但用户可以选择关闭真理或敢于选项。我已经成功地让应用程序从真值或敢于数组的 plist 文件中显示随机引用,我还设法在用户选项视图控制器中编程了两个开关按钮。

我的问题是,如果用户打开了 uiswitchs off,我将如何只显示真话或敢于或两者兼而有之?

- (IBAction)button:(id)sender 
{
    if (!self.plistArray) 
    {
       NSString *path = [[NSBundle mainBundle] pathForResource:
                      @"data" ofType:@"plist"];


       NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];

        if ([[defaults objectForKey:@"truthonoff"] isEqualToString:@"YES"])
        {
            NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
            NSArray *plistArray1 = plistDict[@"truth"];
        }

        if ([[defaults objectForKey:@"dareonoff"] isEqualToString:@"YES"])
        {
            NSDictionary *plistDict2 = [[NSDictionary alloc] initWithContentsOfFile:path];
            NSArray *plistArray2 = plistDict2[@"dare"];
        }

        self.plistArray = [[plistArray1 arrayByAddingObjectsFromArray:plistArray2] mutableCopy];
    }

    NSLog(@"%@", plistArray);
    //check to see if array is empty and display message
    if ([plistArray count] == 0) 
    {
        self.text.text = @"array empty";
    }

    else
    {
        //display random quote from array
        int randV = arc4random() % self.plistArray.count;

        self.text.text = self.plistArray[randV];
        [self.plistArray removeObjectAtIndex:randV];
    }
}

这是我的尝试,但它不会运行,我感觉它不会完成我需要的工作。

基本上,如果用户选择它为真,我需要它只显示真值,或者仅在选择它时才敢显示,或者如果两者都设置为真,则两者都显示。

编辑 抱歉,上面代码的问题是 plist 没有被加载,它直接进入 if array ==0 {

如何确保它加载数组,然后检查从 plist 文件中加载哪些数组?

非常感谢任何帮助

这是我尝试添加 if 语句之前的代码。我很困惑如何最好地做到这一点

    - (IBAction)shownext:(id)sender {


    //load array and check then cycle through this untill array is empty. Array will add two arrays from plist file.



    if (!self.plistArray) {
        NSString *path = [[NSBundle mainBundle] pathForResource:
                          @"data" ofType:@"plist"];



        NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
        NSArray * plistArray1 = plistDict[@"truth"];



        NSDictionary *plistDict2 = [[NSDictionary alloc] initWithContentsOfFile:path];
        NSArray *plistArray2 = plistDict2[@"dare"];

        self.plistArray = [[plistArray1 arrayByAddingObjectsFromArray:plistArray2] mutableCopy];
    }

    NSLog(@"%@", plistArray);
   //check to see if array is empty and display message
    if ([plistArray count] == 0) {
        self.text.text = @"array empty";
    }
else    {
//display random quote from array
    int randV = arc4random() % self.plistArray.count;


    self.text.text = self.plistArray[randV];
    [self.plistArray removeObjectAtIndex:randV];

    }
}

【问题讨论】:

  • 您在问题中谈到了 UISwitch,但我没有看到任何 UISwitch 代码,只有 UIButton。
  • 哪个部分不工作?
  • 我似乎无法让所有代码相互交谈。我想不出关于如何确定以哪种方式检查状态然后显示结果的逻辑
  • 我让 uiswitch 与第二个视图控制器对话,所以没有看到需要发布此代码。我想做的只是根据用户提供的输入仅显示真相或敢于或两者兼而有之。上面是检查ui开关状态的代码。

标签: ios objective-c uiswitch


【解决方案1】:

首先,如果您有一个开关是真实的,一个是敢于的,我希望当用户关闭这两个开关并且不明白为什么他们什么都没有得到(相信我会发生)时,您可以处理一些事情。

对于其余部分,我不确定您的应用程序是如何工作的,但我会猜测一下。我在想你有一个实用风格的应用程序,主 UI 在一个视图中,然后是一个信息按钮,可以翻转到开关所在的第二个视图。我还猜测主视图中有一个按钮可以检索真假字符串。根据您上面的代码,我的最后一个假设是,当用户更改写入用户默认值的开关的状态时,您使用 #define 来避免拼写错误。

当您的视图加载时,您应该加载这两个数组,以防用户在使用您的应用程序的过程中改变主意并打开这两个选项或从一个选项更改为另一个选项。根据您在每个数组中有多少条目,您也可以考虑创建一个组合数组以简化操作。

当按钮被按下时,你应该查看默认值,看看你需要查看两个数组还是只查看一个(下面是伪代码)

if(truth && dare) {
  // if you have a combined array pick a random element from it.
  // otherwise first randomly pick one of the arrays to pick from.
}
else if (truth) {
  // get a random element from the truth array
}
else {
  // get a random element from the dare array
}

此外,您当前对开关值的检查将始终返回 no,除非您在开关视图控制器中做额外的工作。您应该使用[defaults setBool:<UISwitch.isOn> forKey:<#definedKeyHere>][defaults boolForKey:<#definedKeyHere>]

【讨论】:

  • 谢谢,问题是我已经在代码中将两个数组合并到 plistarray 中,那么我将如何选择一个随机数组?
  • 基本上你是对的,我希望用户能够选择一个或另一个。如果我稍后发布完整代码,您可以查看吗?
  • 查看上面的代码,您的 plist 文件似乎有一个字典,其中包含两个数组。如果是这种情况,您可以只保留这两个数组并创建第三个组合在一起的数组。文本不会占用太多内存,因此除非您有数百万个整数,否则这三个数组不会成为问题。如果您需要使用一个数组,请将元素从字符串更改为具有文本键和类型键的字典。然后在选择一个随机条目时查看它的类型,如果错误,请尝试下一个。
【解决方案2】:

知道哪个部分不工作真的很有帮助。一方面,将标志存储为 NSNumber 对象而不是字符串可能会有所帮助(您的字符串比较会失败吗?)。然后你可以这样做:

if ([[defaults objectForKey:@"truthonoff"] boolValue])

使用文字添加实际的 NSNumber - @YES 或 @NO。

考虑将您的逻辑更改为:

VERIFY CODE - doing this freehand:

if (!self.plistArray) 
{
   self.plistArray = [NSMutableArray array];
   NSString *path = [[NSBundle mainBundle] pathForResource:
                  @"data" ofType:@"plist"];

   // why are you loading this twice?
   NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if ([[defaults valueForKey:@"truthonoff"] boolValue])
    {
        [self.plistArray addObject:plistDict[@"truth"]];
    }

    if ([[defaults valueForKey:@"dareonoff"] boolValue])
    {
        [self.plistArray addObject:plistDict[@"dare"]];
    }
}

我假设您加载 Plist 的代码正在运行。验证您的所有密钥都与 Plist 中的内容匹配。设置断点并验证。

对 nil 对象调用方法在 Objective C 中是无操作的。因此,它会很高兴地忽略对 nil 对象的调用而不告诉你。验证你拥有你认为你拥有的东西。

另外,这里:

    //display random quote from array
    int randV = arc4random() % self.plistArray.count;

    self.text.text = self.plistArray[randV];
    [self.plistArray removeObjectAtIndex:randV];

考虑使用 arc4random_uniform(self.plistArray.count),因为它可以避免生成器中的模偏差。 现在,如果您有两个元素,这只会给您说 0 或 1。您确定“truth”和“dare”这两个字典键实际上指向数组吗?

好的,到目前为止一切正常。现在,您有一个数组!所以你需要随机选择一个问题数组,然后随机选择一个问题。

类似:

    //get random array
    int randArrayIndex = arc4random_uniform(self.plistArray.count);
    NSArray* questionArray = self.plistArray[randArrayIndex];

    //get random question 
    int randQuestionIndex = arc4random_uniform([questionArray count]);
    NSString* randomQuestion = questionArray[randQuestionIndex];

    self.text.text = randomQuestion;

    // remove question
    [questionArray removeObjectAtIndex:randQuestionIndex];

反正就是这样。当然,假设您将 NSStrings 存储在那些 Plist 数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多