2012-02-22 4 views
0

Я пытаюсь создать поповер со следующим кодом:UIPopoverController неприятности

//.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 и приложение падает.

Есть ли что-то, что мне не хватает?

EDIT: Я установил распределение . Проблема всегда есть.

+0

положить точку останова в вашем IBAction и посмотреть, где он сработает. включить также [исключения] (http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4) –

ответ

3

Ваш код довольно странный.

Например, почему вы создаете представление и добавляете его в представление содержимого вашего popover?

Затем вы должны обратить внимание на утечки памяти. Их много в коде.

Это простой пример для отображения 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 (или там, где вы хотите) вы можете освободить свой popover и/или отклонить его.

Надеюсь, это поможет.

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 

и использовать его в аа пирог

- (IBAction)yourAction:(id)sender 

    UIButton* senderButton = (UIButton*)sender; 

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

    // same as before... 
} 
+0

спасибо за предложение, я это рассмотрю. и я думаю, я должен был сказать, что я использую ARC в этом проекте. – Padin215

+0

перечитайте свой ответ, и вы предложили сделать мой UIPopoverController в переменной экземпляра, что и стало проблемой – Padin215

+0

. Добро пожаловать. –

0

Проблема, как представляется, следующее:

UILabel *nameLabel; 
nameLabel.text = @"Person's name"; 

nameLabel не инициализирован. Он указывает на случайную память, а при вызове -setText: через текстовое свойство ваше приложение аварийно завершает работу.

Кроме того, у вас есть несколько утечек памяти. Помните: если вы звоните alloc, вы должны указать release. (Я не уверен, как это работает с новым автоматическим назначением/выпуском).

+0

d oh, yep, я изменил его на "UILabel * nameLabel = [[UILabel alloc] init]; " но не исправил это. – Padin215

1

решить мой вопрос from this question.

короткий ответ: ARC не сохраняет UIPopoverController.

Я сделал его переменной экземпляра и отлично работает.