SBTableAlert不工作

时间:2013-04-25 06:26:32

标签: iphone ios xcode4 automatic-ref-counting

首先,我刚刚开始进行iPhone开发。我正在努力让SBTableAlert工作(参见https://github.com/blommegard/SBTableAlert

我的初始设置很简单:我有一个带按钮的UIViewController。按下按钮,我执行以下操作(根据SBTableAlert示例):

- (IBAction)myBtn_Press
{
    SBTableAlert *alert;
    alert   = [[SBTableAlert alloc] initWithTitle:@"Apple Style" cancelButtonTitle:@"Cancel" messageFormat:nil];
    [alert.view setTag:2];
    [alert setStyle:SBTableAlertStyleApple];

    MySecondViewController *myWGVC = [[MySecondViewController alloc] init];

    [alert setDelegate:myWGVC];
    [alert setDataSource:myWGVC];

    [alert show];
}

MySecondViewController声明为:

@interface MySecondViewController : NSObject <SBTableAlertDelegate, SBTableAlertDataSource>

这意味着它将作为表视图的委托。我还包括以下内容(粘贴自示例):

@implementation MySecondViewController

#pragma mark - SBTableAlertDataSource

- (UITableViewCell *)tableAlert:(SBTableAlert *)tableAlert cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;

    if (tableAlert.view.tag == 0 || tableAlert.view.tag == 1) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    } else {
        // Note: SBTableAlertCell
        cell = [[SBTableAlertCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    }

    [cell.textLabel setText:[NSString stringWithFormat:@"Cell %d", indexPath.row]];

    return cell;
}

- (NSInteger)tableAlert:(SBTableAlert *)tableAlert numberOfRowsInSection:(NSInteger)section {
    if (tableAlert.type == SBTableAlertTypeSingleSelect)
        return 3;
    else
        return 10;
}

- (NSInteger)numberOfSectionsInTableAlert:(SBTableAlert *)tableAlert {
    if (tableAlert.view.tag == 3)
        return 2;
    else
        return 1;
}

- (NSString *)tableAlert:(SBTableAlert *)tableAlert titleForHeaderInSection:(NSInteger)section {
    if (tableAlert.view.tag == 3)
        return [NSString stringWithFormat:@"Section Header %d", section];
    else
        return nil;
}

#pragma mark - SBTableAlertDelegate

- (void)tableAlert:(SBTableAlert *)tableAlert didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableAlert.type == SBTableAlertTypeMultipleSelct) {
    UITableViewCell *cell = [tableAlert.tableView cellForRowAtIndexPath:indexPath];
        if (cell.accessoryType == UITableViewCellAccessoryNone)
            [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
        else
            [cell setAccessoryType:UITableViewCellAccessoryNone];

            [tableAlert.tableView deselectRowAtIndexPath:indexPath animated:NO];
    }
}

- (void)tableAlert:(SBTableAlert *)tableAlert didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSLog(@"Dismissed: %i", buttonIndex);
}

我收到的错误消息是:

2013-04-25 00:13:35.389 MyTestProject[3386:c07] *** -[SBTableAlert tableView:cellForRowAtIndexPath:]: message sent to deallocated instance 0x682ed80

但是我不知道如何跟踪或调试它。看起来它可能与ARC有关,因为演示项目没有使用它,但我无法确定如何解决这个问题。

感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

尝试在主要UIViewController子类中为strongalert对象创建具有myWGVC属性的属性。由于没有强烈引用警报的委托/数据源和警报本身,因此在屏幕上显示警报之前,它们似乎因ARC而被释放。