根据uiswitch的状态加载数组和显示

时间:2014-03-23 20:24:29

标签: ios objective-c uiswitch

我正在尝试开发一个显示随机真相或胆敢类型问题的应用,但是用户可以选择关闭真相或胆量。我已成功设法让应用程序显示来自真实或敢于数组的plist文件的随机引用,我也设法在用户选项视图控制器中编程两个开关按钮。

我的问题是,如果用户已关闭uiswitchs,我将如何仅显示真相或两者或两者?

- (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];
    }
}

这是我的尝试然而它不会运行,我感觉它不会ddo我需要的工作。

基本上我需要它只显示真实性,如果用户选择了为真,或者只有在选中时才显示,或两者都设置为真。

EDIT 对不起上面代码的问题是plist没有被加载,如果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];

    }
}

2 个答案:

答案 0 :(得分:0)

知道哪些部分不起作用真的很有帮助。首先,将标志存储为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"]];
    }
}

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

在目标C中调用nil对象上的方法是无操作。因此,它会在不告诉您的情况下高兴地忽略对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。你确定两个字典键,"真相"并且"敢于"实际上指向数组?

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

类似的东西:

    //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数组中。

答案 1 :(得分:0)

首先,如果你有一个真理切换和一个敢于切换的话,我希望你有一些适当的东西来处理当用户关闭两个开关并且不理解为什么他们什么也得不到时(相信我会发生这种情况) )。

对于其他人,我不确定你的应用程序是如何工作的,但我会猜测。我认为你有一个实用程序样式应用程序,主视图在一个视图中,然后是一个信息按钮,翻转到开关所在的第二个视图。我还猜测主视图中有一个按钮可以检索真相或敢于字符串。根据您上面的代码,我的最终假设是,当用户更改写入用户默认值的开关的状态时,您已使用#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>]