根据所选的视图控制器调用不同的方法

时间:2013-05-09 23:24:45

标签: ios objective-c xcode uiviewcontroller storyboard

文字很复杂但是lemme试一试。我有一个MenuViewController,它有一个带有类别名称的数组,点击tableview中的类别行,使用Storyboard ID实例化一个不同的视图控制器。

现在,如果我为每个视图控制器使用不同的类,那将是许多冗余的代码和类。我想要做的是为所有这些视图控制器使用一个类,让我们称之为PrimaryViewController,并在MenuViewController中选择不同的类别时,它在PrimaryViewController中调用不同的方法或块。

这是PrimaryViewController中的方法:

- (void) fetchData:(NSInteger )pageNumber
{        
        channel = [[TheFeedStore sharedStore] fetchWebService:pageNumber withCompletion:^(RSSChannel *obj, NSError *err){

            if (!err) {

                int currentItemCount = [[channel items] count];
                channel = obj;
                int newItemCount = [[channel items] count];

                int itemDelta = newItemCount - currentItemCount;
                if (itemDelta > 0) {
                    NSMutableArray *rows = [NSMutableArray array];

                    for (int i = 0; i < itemDelta; i++) {
                        NSIndexPath *ip = [NSIndexPath indexPathForRow:i inSection:0];
                        [rows addObject:ip];
                    }
                    [[self tableView] insertRowsAtIndexPaths:rows withRowAnimation:UITableViewRowAnimationBottom];
                }
            }
        }];
}

上述代码可以加载一个类别。请注意第一行“channel = [[TheFeedStore sharedStore] fetchWebService ”,其他类别在另一个名为TheFeedStore的类中命名为“fetchWebServiceCat2”,“fetchWebServiceCat3”和“fetchWebServiceCat4”。

我想要的是当从MenuViewController实例化不同的视图控制器时,它应该使用PrimaryViewController的fetchData方法来调用TheFeedStore的不同类别方法。

谢谢!

1 个答案:

答案 0 :(得分:2)

[store fetchWebService:webService withCompletion:completion];

相当于:

[store performSelector:@selector(fetchWebService:withCompletion:)
            withObject:webService
            withObject:completion];

所以你可以这样做:

SEL sel = nil;

if (...) sel = @selector(fetchWebService:withCompletion:);
if (...) sel = @selector(fetchWebServiceCat2:withCompletion:);
...

[store performSelector:sel withObject:webService withObject:^{}];

甚至这个:

SEL sel = NSSelectorFromString([NSString stringWithFormat:@"fetchWebService%@:withCompletion:", @"Cat2"]);
...