ios - UIButton EXC_BAD_ACCESS on setTitle :forState

标签 ios objective-c

我有一个从 IB 实例化的 View Controller 。它包含一个 UIButton,其操作创建一个 UIPopoverController,其委托(delegate)通过以下方式更新 UIButton 的标题:

- (void) popoverSelected:(NSString*)string {
    [self.sortButton setTitle:string forState:UIControlStateNormal];
    [self.sortPickerPopover dismissPopoverAnimated:YES];
}
popoverSelectedUIPopoverController 的委托(delegate)方法,其中包含一个简单的 UITableView .
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *selectedSort = [_sortTypes objectAtIndex:indexPath.row];

    if (_delegate != nil) {
        [_delegate popoverSelected:selectedSort];
    }
}

弹出框由 self.button 上的 TouchUpInside 操作实例化。通过:
- (IBAction)sortButtonPressed:(id)sender {
    if (_sortPicker == nil) {
        // Create the picker view controller
        _sortPicker = [[SortPickerViewController alloc] initWithStyle:UITableViewStylePlain];

        // Set this as the delegate
        _sortPicker.delegate = self;
    }

    if (_sortPickerPopover == nil) {
        // The colour picker popover is not showing. Show it
        _sortPickerPopover = [[UIPopoverController alloc] initWithContentViewController:_sortPicker];
        [_sortPickerPopover presentPopoverFromRect:_sortButton.frame
                                            inView:self.view
                          permittedArrowDirections:UIPopoverArrowDirectionAny
                                          animated:YES];
    } else {
        // if it's showing, we want to hide it
        [_sortPickerPopover dismissPopoverAnimated:YES];
        _sortPickerPopover = nil;
    }
}

第一次更新按钮的标题时这没有问题,但第二次我得到一个 EXC_BAD_ACCESS执行 setTitle 时:在 popoverSelected .

我看不到我意外释放按钮的任何地方(此时该对象肯定仍然存在)。该项目正在使用ARC。

使用 NSZombies,我偶尔会到达 [__NSArrayI valueRestriction] unrecognised selector sent to instance这更没有意义。

我可以采取任何明显的方法来进一步调试吗?

最佳答案

而不是检查 _sortPickerPopover == nil要知道是否显示它,你应该检查[_sortPickerPopover isPopoverVisible] .另外,我会将构造代码放入自动加载器中。

- (UIPopoverController *)sortPickerPopover
{
    if (!_sortPickerPopover) {
        _sortPickerPopover = [[UIPopoverController alloc] initWithContentViewController:self.sortPicker];
    }
    return _sortPickerPopover;
}

- (SortPickerViewController *)sortPicker
{
    if (!_sortPicker) {
        _sortPicker = [[SortPickerViewController alloc] initWithStyle:UITableViewStylePlain];

        // Set this as the delegate
        _sortPicker.delegate = self;
    }
    return _sortPicker;
}

- (IBAction)sortButtonPressed:(UIButton *)sender 
{
    if ([self.sortPickerPopover isPopoverVisible]) {
        [self.sortPickerPopover dismissPopoverAnimated:YES];
    } else {
            [self.sortPickerPopover presentPopoverFromRect:sender.frame
                                                    inView:sender
                                  permittedArrowDirections:UIPopoverArrowDirectionAny
                                                  animated:YES];
    }
}

/***
 * NOTE: Delegate methods should always pass the calling object as the first 
 * object. Additionally, the name is not very descriptive of what is actually
 * being performed and does not use should/will/did naming conventions.
 * You should consider changing this method to something like:
 *  - (void)sortPickerViewController:(SortPickerViewController *)sortPicker   
 *               didSelectSortMethod:(NSString *)sortMethod
 **/
- (void)popoverSelected:(NSString *)string 
{
    [self.sortButton setTitle:string forState:UIControlStateNormal];
    [self.sortPickerPopover dismissPopoverAnimated:YES];
}

一旦进行了这些更改,唯一可能的其他问题来源就是您的 SortPickerViewController 的实现。如果您也可以发布该 View Controller ,我会为您查看。

关于ios - UIButton EXC_BAD_ACCESS on setTitle :forState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665947/

相关文章:

ios - 是否可以编辑 UIAlertAction 标题字体大小和样式?

iphone - 创建一个 UINavigationController 以在没有 Interface Builder 的 UITableViewController 中使用

ios - 如何将一个数组添加到另一个数组

iphone imagepickerController 从照片库中挑选视频

iphone - UVIews 缩放 UIScrollview 时的比例

ios - 无法在 Storyboard 上引用 UILabel

ios - 如何从 Xcode 的静态库中打开 viewController?

ios - 来自 AppStore 的 IPA 和来自 XCode 的 IPA 之间的二进制区别是什么?

ios - UIActivityIndi​​catorView 在我想要的时候不停止

ios - 尝试添加 UIImageView 数组的约束