Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 超控器故障_Objective C_Ios_Cocoa Touch_Uipopovercontroller - Fatal编程技术网

Objective c 超控器故障

Objective c 超控器故障,objective-c,ios,cocoa-touch,uipopovercontroller,Objective C,Ios,Cocoa Touch,Uipopovercontroller,我正在尝试使用以下代码创建popover: //.h @interface LoginViewController : UIViewController <UIPopoverControllerDelegate> .... @end //.m - (IBAction)popoverTest:(id)sender { UIViewController *popoverContent = [[UIViewController alloc] init]; UIView *

我正在尝试使用以下代码创建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");
}
/.h
@接口LoginViewController:UIViewController
....
@结束
//m
-(iAction)popoverTest:(id)发送方
{
UIViewController*popoverContent=[[UIViewController alloc]init];
UIView*myView=[[UIView alloc]initWithFrame:CGRectMake(0,0,300,300)];
UILabel*nameLabel=[[UILabel alloc]init];//已编辑,已修复UILabel分配
namelab.text=@“人名”;
[nameLabel sizeToFit];
namelab.frame=CGRectMake(10,10,namelab.frame.size.width,namelab.frame.size.height);
[myView addSubview:nameLabel];
popoverContent.view=myView;
popoverContent.contentSizeForViewInPopover=CGSizeMake(300300);
UIPopoverController*popoverController=[[UIPopoverController alloc]initWithContentViewController:popoverContent];
popoverController.delegate=self;
[popoverController presentPopoverFromRect:((UIButton*)发送器)。查看帧:self.view许可证行方向:UIPopOverErrorDirection任意动画:是];
NSLog(@“运行所有代码”);
}
我创建了一个
UIView
,将一个标签作为子视图,然后将我的视图分配给
UIViewController.view
。然后我创建了一个popover控制器,调整了popover控制器的大小,设置了代理,并从按钮的框架中呈现了它

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

有什么我遗漏的吗


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

问题似乎如下:

UILabel *nameLabel;
nameLabel.text = @"Person's name";
namelab
未初始化。它指向随机内存,当通过text属性调用
-setText:
时,应用程序崩溃

除此之外,您还有一些内存泄漏。记住:如果你调用
alloc
,你必须
在某个地方释放它。

(我不确定新的自动alloc/release如何工作)。

问题似乎如下:

UILabel *nameLabel;
nameLabel.text = @"Person's name";
namelab
未初始化。它指向随机内存,当通过text属性调用
-setText:
时,应用程序崩溃

除此之外,您还有一些内存泄漏。记住:如果你调用
alloc
,你必须
在某个地方释放它。

(我不确定新的自动alloc/release是如何工作的)。

您的代码非常奇怪

例如,为什么要创建视图并将其添加到popover的内容视图中

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

也就是说,这里有一个简单的示例,用于在
UIPopoverController
中显示
UIViewcontroller

- (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
是具有保留策略的
@属性。通过这种方式,在
UIPopoverControllerDelegate
方法中(或在任何您想要的地方),您可以释放popover和/或关闭它

希望能有帮助

请检查代码,因为我是手写的

编辑

通常在创建popover时,其内容视图控制器是或是自定义的
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...
}

你的代码很奇怪

例如,为什么要创建视图并将其添加到popover的内容视图中

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

也就是说,这里有一个简单的示例,用于在
UIPopoverController
中显示
UIViewcontroller

- (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
是具有保留策略的
@属性。通过这种方式,在
UIPopoverControllerDelegate
方法中(或在任何您想要的地方),您可以释放popover和/或关闭它

希望能有帮助

请检查代码,因为我是手写的

编辑

通常在创建popover时,其内容视图控制器是或是自定义的
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...
}
解决了我的问题

简短回答:ARC没有保留UIPopoverController

我将它作为一个实例变量,工作正常。

解决了我的问题

简短回答:ARC没有保留UIPopoverController


我把它变成了一个实例变量,效果很好。

d'oh,是的,我把它改成了“UILabel*namelab=[[UILabel alloc]init];”但没有修好。d'oh,是的,我把它改成了“UILabel*namelab=[[UILabel alloc]init];”但没有修好。在iAction中放置一个断点,看看它在哪里崩溃。enable还可以在iAction中放置一个断点,并查看它在何处崩溃。谢谢你的建议,我会考虑的。我想我应该说我在这个项目中使用ARC。重新阅读你的答案,并且你确实建议把我的UIPopFuver控制器变成一个实例变量,这是修正这个建议的问题,我会考虑的。我想我应该声明我在这个项目中使用了ARC。重新阅读你的答案,你确实建议将我的UIPopoverController变成一个实例变量,这就是解决这个问题的方法