Сбой приложения iPhone в методе loadView при создании кнопки UIB - PullRequest
0 голосов
/ 27 мая 2011

Почему следующее приложение вызывает сбой при загрузке этого представления?

-(void)loadView {
    UIButton *chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure] retain];
    [chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside ];
    chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
    [self.view addSubview:chooseSubjectButton];
}

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 7 ]

4 голосов
/ 27 мая 2011

Полагаю, ваше приложение на самом деле не падает.Он просто постоянно вызывает метод loadView, потому что вы пропустили загрузку представления.Позвоните [super loadView] или создайте представление и назначьте его как self.view, прежде чем добавлять что-либо в self.view .Удобным способом было бы использовать [super loadView].

- (void)loadView {

    [super loadView];
    // Your Code Here
}
2 голосов
/ 27 мая 2011

Отсутствие [super loadView], как отмечает @Simon, вызывает другой вопрос.

Вы загружаете этот viewController со связанным файлом .xib? Если это так, вы, вероятно, хотите сделать это в -viewDidLoad, а не -viewLoad.

Просто мысль, потому что я запутался в этом в прошлом.

1 голос
/ 27 мая 2011

Хорошо, в ответах, которые даны здесь, довольно много путаницы ...

Во-первых, вы правы, что не звоните [super loadView];, см. - (void)loadView:

Если вы переопределите этот метод для создания своих представлений вручную, вы должны сделать это и назначить корневое представление вашей иерархии свойству представления.(Представления, которые вы создаете, должны быть уникальными экземплярами и не должны использоваться совместно с любым другим объектом контроллера представления.) Ваша пользовательская реализация этого метода не должна вызывать super.

Если вы действительно хотите использовать loadView (т. е. создавая ваше представление программно, а не из NIB), тогда в вашей реализации вы должны назначить свойство view вашего контроллера.

Кроме того, вам не нужносохраняйте свою кнопку так, как вы ее используете, потому что вы добавляете ее как подпредставление вашего основного представления (после этого оно будет принадлежать вашему основному представлению).

Исходя из этих соображений, ваш метод будет выглядетьнапример:

    -(void)loadView {
        CGRect frame = [[UIScreen mainScreen] applicationFrame]; // adjust to your needs
        UIView *rootView = [[UIView alloc] initWithFrame:frame];

        UIButton *chooseSubjectButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
        [chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside];

        [rootView addSubview:chooseSubjectButton];

        self.view = rootView;
        [rootView release];
    }

Конечно, если вы используете NIB для определения своего корневого представления, вам необходимо переопределить -viewDidLoad: для дополнительной настройки.

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

0 голосов
/ 02 мая 2013

Вы получаете бесконечный цикл, потому что вы ссылаетесь на self.view в loadView. Когда вы вызываете self.view, а self.view равен nil, это вызывает повторный вызов loadView. Создание цикла.

Если вы вызываете [super loadView], он инициализирует self.view, поэтому вы не видите проблему.

Итак, создайте сами себе экземпляр, и все будет в порядке.

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

0 голосов
/ 02 июля 2011

Просто для любого, кто читает эту ветку, Окти прав, говоря, что вы никогда не должны вызывать [super loadView]. Я прочитал некоторые дебаты на этой странице об этом. Прочитайте документацию, опубликованную в ответе Окти, на странице 28 четко указано, что вам не следует вызывать этот метод. Это даже объясняется почему. При этом будет выполнен поиск пера с использованием имени по умолчанию (так же, как и имя класса). Даже если этот кончик не существует, это пустая трата вычислительной мощности. Просто создайте новый UIView и установите его как self.view. (см. примеры на этой странице)

Просто хотел убедиться, что будущие читатели знают об этом. Мне понадобилось время, чтобы понять это.

0 голосов
/ 27 мая 2011
-(void)loadView 
{
[super loadView];
UIButton *chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure] retain];
[chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside ];
chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
[self.view addSubview:chooseSubjectButton];
}

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

0 голосов
/ 27 мая 2011

Попробуйте поместить этот код в viewDidLoad.Init-коды могут создавать бесконечную трассировку стека.Хотя я не уверен, что создание этой кнопки может вызвать сбой.

Кто-нибудь исправит меня, если я ошибаюсь

См. Это: iPhone SDK: в чем разница между loadViewи viewDidLoad?

...