tableView:didSelectRowAtIndexPath:调用current-view Parser委托

时间:2012-01-26 00:30:13

标签: iphone ios uitableview nsarray nspredicate

我有一些非常有趣的逻辑,基本上我有这个数据,我想检查 在我显示下一个视图之前..以防数据为空我想要弹出视图,如果数据不为空,那么我想加载视图以将其显示在导航堆栈上。

所以在我的tableView:didSelectRowAtIndexPath:方法中,当选择I时,获取当前的选择ID号,这样我就可以将要解析的数据的值限制为仅相关的值。

这是代码在我的方法中的样子。

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    ///... This stuff is for context.. 

            //Get the subview ready for use
            VSRViewController *vSRViewController = [[VSRViewController alloc] initWithNibName:@"VSRViewController" bundle:nil];
            //Sets the back button for the new view that loads (this overrides the usual parentview name with "Back")
            self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil];
            //Pass Title over to subview
            vSRViewController.title = @"SubModel";

            //Selected cell gives restult to the subview or o the parent view to be displayed.. when the view is pushed or poped 
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MODEL",cell.textLabel.text];
            filterArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

            //Sets restriction string so that when subCacheData is parsed only values mathching modIdString will be parsed
            modIdString = [[filterArray valueForKey:@"MODID"] objectAtIndex:0]; //Restricts Mods dataset

            //This sets which if statment to enter in parserDidEndDocument
            dataSetToParse = @"ModID";
            [self startTheParsingProcess:modCacheData];

            //tempModArra is the array I get back from the parser that has had the restriction string applied to it
            if ([tempModArray count] == 0) {
                NSLog(@"POPVIEW"); //testing
                //pop this view to the parent view.. organize all the values that have to be sent back with protocols and delegates
            }else if ([tempModArray count] != 0){

                //Pass the selected object to the new view controller.
                [self.navigationController pushViewController:vSRViewController animated:YES];

                //Check if modIndexPath is same as selected if not remove accessory tick from the subview
                if (![modIndexPath isEqual:indexPath]){
                    submodIndexPath = nil;
                }
                [vSRViewController subModelCachedData:modCacheData indexPath:submodIndexPath dataSetToParse:@"ICSum" modelArray:filterArray modIndexPath:indexPath];

            //.....
            }
            }
    }
    //...

此代码已经过编辑以便于阅读,其中还有很多其他内容......所以有些事情可能有问题......因为我编辑了一些名字......但它应该没问题。

这是我的解析器委托中发生的事情。

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    //.. other stuff up here.
    if (dataSetToParse == @"ModID") {
        //This applies the 
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ModID",modIdString]; //modIdString restricts results that have been parsed
        NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

        tempModArray = filteredArray;

        //what do I do here to get tempModArray back up to tableView:didSelectRowAtIndexPath: method.. this is where I am abit lost.
    }

}

就是这样......一切正常,唯一的问题就是我无法将我的temoModArray带回tableView:didSelectRowAtIndexPath:所以我需要一些帮助来思考解决方案。

同样对于上下文,我这样做的原因是,如果tempModArray中没有值,我想将用户发送回父视图,因此他们在转到子视图进行选择时看不到空的tableview希望这一切都有意义..我期待着我们的回复。

1 个答案:

答案 0 :(得分:1)

  

我该怎么做才能让tempModArray备份到tableView:didSelectRowAtIndexPath:method

简短的回答:你没有。

didSelectRow已经完成了他的工作,即告知应用用户选择了该行。 现在该应用程序还有一些工作要做。也就是说,弄清楚它是否会用数据推送新的视图控制器。所以不要推,决定是否有数据,然后弹出;相反,如果没有数据,请不要放在第一位。

在解析器知道它是否有数据的位置,您有很多选择。 我假设您的解析器委托不在您的表视图控制器类中。 你可以:

  • 发布您的表视图控制器正在侦听的NSNotification,如果有数据,侦听方法可以推送详细视图控制器,如果没有,则可以推送no-op。您可以在通知中传递数组。
  • 直接在表视图控制器上调用方法来推送详细视图控制器,传入数组(在表视图控制器头中声明一个协议,并将解析器委托调用到该方法中)
  • 直接从解析器推送详细视图控制器(有点icky)
  • 使用KVO

imo协议方法是最干净的,(松耦合但具有良好的命名),但每个都是自己的。