我正在尝试使用以下代码创建一个popover:
//.h
@interface LoginViewController : UIViewController <UIPopoverControllerDelegate>
....
@end
//.m
- (IBAction)popoverTest:(id)sender
{
UIViewController *popoverContent = [[UIViewController alloc] init];
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
UILabel *nameLabel = [[UILabel alloc] init]; //edited, fixed UILabel allocation
nameLabel.text = @"Person's name";
[nameLabel sizeToFit];
nameLabel.frame = CGRectMake(10, 10, nameLabel.frame.size.width, nameLabel.frame.size.height);
[myView addSubview:nameLabel];
popoverContent.view = myView;
popoverContent.contentSizeForViewInPopover = CGSizeMake(300, 300);
UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
popoverController.delegate = self;
[popoverController presentPopoverFromRect:((UIButton *)sender).frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
NSLog(@"ran all code");
}
我创建了一个UIView
,将标签作为子视图,然后将我的视图分配给UIViewController.view
。然后我创建了一个弹出控制器,调整弹出控制器的大小,设置委托并从按钮的框架中显示它。
我收到SIGABRT并且应用程序崩溃了。
我有什么遗失的吗?
编辑:我修复了UILabel
分配。问题始终存在。
答案 0 :(得分:3)
你的代码很奇怪。
例如,为什么要创建视图并将其添加到弹出窗口的内容视图中?
然后,你必须注意内存泄漏。你的代码中有很多它们。
也就是说,这是一个在UIViewcontroller
中显示UIPopoverController
的简单示例。
- (IBAction)yourAction:(id)sender
UIButton* senderButton = (UIButton*)sender;
UIViewController* yourController = [[UIViewController alloc] init];
UIPopoverController* pop = [[UIPopoverController alloc] initWithContentViewController:yourController];
pop.delegate = self;
pop.popoverContentSize = CGSizeMake(300, 300);
self.popover = pop;
[pop presentPopoverFromRect:senderButton.bounds inView:senderButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
pop.passthroughViews = nil;
[yourController release];
[pop release];
}
其中self.popover
是具有保留政策的@property
。以UIPopoverControllerDelegate
方法(或您想要的任何地方)以这种方式,您可以释放您的弹出窗口和/或关闭它。
希望它有所帮助。
P.S。检查代码,因为我是手写的。
修改强>
通常在创建弹出窗口时,其内容视图控制器是自定义UIViewController
或UINavigationController
(在这种情况下,您希望利用其导航栏)。
例如,您可以创建自定义的
,而不是简单的UIViewController
//.h
@interface CustomUIViewController : UIViewController
@end
//.m
@implementation CustomUIViewController
// other code here...
- (void)viewDidLoad
{
// here you are sure that the view has been loaded in memory (alternatively override loadView method), so
UIView* greenView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
green.backgroundColor = [UIColor greenColor];
[self.view addSubview:greenView];
[greenView release];
}
@end
并在一个popover中使用它
- (IBAction)yourAction:(id)sender
UIButton* senderButton = (UIButton*)sender;
CustomUIViewController* yourController = [[CustomUIViewController alloc] init];
// same as before...
}
答案 1 :(得分:1)
答案 2 :(得分:0)
问题似乎如下:
UILabel *nameLabel;
nameLabel.text = @"Person's name";
nameLabel
未初始化。它指向随机内存,当通过text-property调用-setText:
时,应用程序崩溃。
除此之外,您还有一些内存泄漏。请记住:如果您致电alloc
,则必须在某处release
。
(我不确定新的自动分配/释放是如何工作的。)