UIPopoverController проблема - PullRequest
       14

UIPopoverController проблема

0 голосов
/ 22 февраля 2012

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

//.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: я исправил распределение UILabel. Проблема всегда есть.

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

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

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

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

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

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

PS Проверьте код, потому что янаписано от руки.

Редактировать

Обычно при создании всплывающего окна его контроллер представления содержимого является либо пользовательским 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 голос
/ 23 февраля 2012

решил мою проблему из этого вопроса.

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

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

0 голосов
/ 22 февраля 2012

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

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

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

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

...