首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPopoverController故障

UIPopoverController故障
EN

Stack Overflow用户
提问于 2012-02-23 01:05:17
回答 3查看 2.5K关注 0票数 0

我正在尝试用下面的代码创建一个弹出窗口:

代码语言:javascript
复制
//.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。然后我创建了一个popover控制器,调整popover控制器的大小,设置代理并将其从按钮的框架中呈现出来。

我收到一个SIGABRT,应用程序崩溃了。

我是不是漏掉了什么?

编辑:我修复了UILabel的分配。问题总是存在的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 01:53:38

你的代码很奇怪。

例如,为什么要创建一个视图,并将其添加到弹出窗口的内容视图中?

然后,您必须注意内存泄漏。在你的代码中有很多这样的代码。

也就是说,这里是一个在UIPopoverController中显示UIViewcontroller简单示例。

代码语言:javascript
复制
- (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方法中(或您想要的任何地方),您可以释放您的弹出窗口和/或关闭它。

希望能有所帮助。

附言:检查代码,因为我是用手写的。

编辑

通常,当您创建弹出窗口时,其内容视图控制器是或自定义UIViewControllerUINavigationController (在这种情况下,您希望利用其导航栏)。

例如,您可以创建一个自定义的UIViewController,而不是简单的For

代码语言:javascript
复制
//.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

并在弹出窗口中使用它

代码语言:javascript
复制
- (IBAction)yourAction:(id)sender

    UIButton* senderButton = (UIButton*)sender;

    CustomUIViewController* yourController = [[CustomUIViewController alloc] init];

    // same as before...
}
票数 3
EN

Stack Overflow用户

发布于 2012-02-23 04:16:10

解决了我的问题from this question.

简而言之: ARC不保留UIPopoverController。

我把它变成了一个实例变量,并且运行得很好。

票数 1
EN

Stack Overflow用户

发布于 2012-02-23 01:13:50

问题似乎是这样的:

代码语言:javascript
复制
UILabel *nameLabel;
nameLabel.text = @"Person's name";

nameLabel未初始化。它指向随机内存,当通过文本属性调用-setText:时,您的应用程序会崩溃。

除此之外,您还存在一些内存泄漏。记住:如果你调用alloc,你必须在某个地方release它。(我不确定新的自动分配/释放是如何工作的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9399479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档