gpt4 book ai didi

ios - UIButton EXC_BAD_ACCESS on setTitle :forState

转载 作者:行者123 更新时间:2023-12-01 16:46:24 24 4
gpt4 key购买 nike

我有一个从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com