将UITableView委托函数链接回其他函数

时间:2015-06-02 20:10:00

标签: ios objective-c uitableview

我已经创建了一个自定义警报方法,里面有一个UITableView。

typedef void (^Succes)(id data);
typedef void (^Failure)(NSError *error);

+ (void)testForTable:(NSString *)title withSuccess:(Succes)success failure:(Failure)failure {
    SCLAlertView *alert = [[SCLAlertView alloc] initWithNewWindow];
    alert.customViewColor = [UIColor paperColorLightBlue500];
    [alert setShowAnimationType:SlideInFromRight];
    UITableView *tableView = [alert addTableView];
    tableView.delegate = self;
    tableView.dataSource = self;

    [alert showEdit:self title:@"Test for table"
                subTitle:@"This is a test alert for a table"
        closeButtonTitle:nil duration:0.0f];
}

#pragma mark - TableView Methods
+ (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 40;

}

+ (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

+ (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

    return cell;
}

+ (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%d", indexPath.row);
}

现在,理想情况下,当用户触及UITableViewCell时,我希望将indexPath.row传递回Success的{​​{1}}参数。我怎样才能做到这一点?这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

SCLAlertView应该是UITableView的委托,因此它可以处理didSelectRowAtIndexPath:

看到dataSource非常简单,SCLAlertView也可以是dataSource。

所以:

tableView.delegate = alert;
tableView.dataSource = alert;

然后将您的委托实现移动到SCLAlertView。

编辑

我不知道对象Success是什么类型的对象,但是如果它被阻止,您可以在UIViewController上保留对它的引用,并在{didSelectRowAtIndexPath:时调用它1}}。

编辑2

您的成功块需要接受NSInteger参数:

typedef void (^Success)(id data, NSInteger row);

然后你会在代表上调用它:

+ (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    id data; //this data is a placeholder, i dont know how you get this.
    if (self.success) {
        self.success(data, indexPath.row);
    }
}

您可以在代理

上保留成功块的引用
@property (nonatomic, copy) Success success;