Цель-C: метод экземпляра никогда не вызывается - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть класс под названием RootViewController с этим:

Test *myLevelObject = [[Test alloc] init];
[myLevelObject afficher];

Предполагается вызвать мой метод -[ Test afficher], но нет предупреждения или ошибки, и он действительно вводит метод. Есть идеи? ТНХ

Декларация об испытательном классе:

test.m:

#import "Test.h"
#import "RootViewController.h"

test.h:

#import <UIKit/UIKit.h>
@class RootViewController;
@interface Test : UIViewController <UIActionSheetDelegate,UITextFieldDelegate>{




-(void) afficher{



   NSLog(@"hello");
   poids.text = [NSString stringWithFormat:@"lol"];
   labelalco.text = [NSString stringWithFormat:@"cac"];

}

он показывает в консоли "привет", но он не выполняет мои 2 строки кода.

хорошо, теперь я попытался сделать UIAlertView, и он работает, но он терпит неудачу, только когда я использую переменные которые инициализируются в Test.h с помощью построителя интерфейса.

Инициализация:

IBOutlet UILabel *labelalco;

Интерфейсный конструктор: альтернативный текст http://img72.imageshack.us/img72/4507/screenshot20100225at090.png

это еще один снимок экрана, где показан тест и раздел 'drink', являющийся rootviewcontroller.

СПАСИБО

Ответы [ 5 ]

2 голосов
/ 24 февраля 2010

Возможно, ваш метод init возвращает ноль, а не объект. Если это так, то метод -afficher отправляется на ноль, который не ломается, но ничего не делает. Проверьте возвращаемое значение после alloc / init.

1 голос
/ 24 февраля 2010

Поскольку вы говорите, что сообщение NSLog в методе afficher записывается на консоль, ваш метод вызывается опытным путем. Это не делает то, что вы намереваетесь сделать, это ошибка в вашем коде. Из предоставленного вами минимального списка я бы предположил, что poids и lableco не инициализированы должным образом (то есть они все еще nil при вызове вашего метода).

0 голосов
/ 25 февраля 2010

В ваших последних комментариях говорится, что вы используете UITabBarController, который содержит RootViewController и Test.

Но в RootViewController вы пытаетесь вызвать метод в Test, создав новый его экземпляр. Этот экземпляр будет отличаться от того, который использует tabbarcontroller.

Я думаю, что в RootViewController вам нужно вместо этого получить ссылку на тот же экземпляр Test, который использует tabbarcontroller.

См. Этот пост для возможного способа сделать это:

iPhone SDK: как получить доступ к ViewController, вложенному в TabBar из MyAppDelegate?

Однако, почему у вас есть код в RootViewController, который обновляет Test? Если отображается «Тест», не может ли он обновиться сам? Как код в RootViewController выполняется после того, как Test уже был отображен?

0 голосов
/ 25 февраля 2010

Я повторяю то, что было сказано выше. Вероятно, ваш активатор будет вызван, если вы увидите вывод "hello" в вашей консоли. (Чтобы быть абсолютно уверенным, очистите консоль перед запуском и убедитесь, что она снова отображается, чтобы исключить устаревший вывод.) Еще одна вещь, которую я бы предложил, это использовать NSAssert (), чтобы убедиться, что ваши выходы установлены. Вот пример:

-(void) afficher{

   NSLog(@"hello");
   NSAssert(nil!=poids, @"poids should be set.");
   poids.text = [NSString stringWithFormat:@"lol"];
   NSAssert(nil!= labelalco, @"labelalco should be set.");
   labelalco.text = [NSString stringWithFormat:@"cac"];

}

Я просто очень внимательно посмотрел на ваши снимки экрана, и кажется, что ваш тестовый объект - UIViewController. Из того, что вы описываете, держу пари, вы предполагаете, что labelalco будет установлен через соединения с создателем интерфейса. Этого не произойдет в вашем первом фрагменте кода, потому что вы создаете его непосредственно без использования файла nib.

Test *myLevelObject = [[Test alloc] init];
[myLevelObject afficher];

должно быть:

Test *myLevelObject = [[Test alloc] initWithNibName:@"Test.xib" bundle:nil];
[myLevelObject afficher];

Предполагается, что Test.xib - это то место, где выполняются соединения в IB. Похоже, что это субконтроллер в контроллере представления вкладок вашего главного окна, поэтому в том, что вы пытаетесь сделать, может быть дополнительная сложность.

0 голосов
/ 25 февраля 2010

Если вы используете IBOutlet в методе -init, он не будет работать там (я полагаю, он установлен на nil), но он должен работать в методе -awakeFromNib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...