Как работать с наследованием в iOS SDK - PullRequest
0 голосов
/ 13 декабря 2011

Я только начал изучать программирование на iOS, и у меня проблема с наследованием.Есть 2 файла.

Первый файл

Заголовок

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    UILabel *myLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *myLabel;
@end

Реализация:

#import "ViewController.h"
#import "NewClass.h"
@implementation ViewController
@synthesize myLabel;
#pragma mark - View lifecycle
- (void)viewDidLoad {
    [super viewDidLoad];
    myLabel.text = @"ViewController text!";    
    NewClass *myClass = [[[NewClass alloc] init] autorelease];
    [myClass setLabelText];
}
@end

Второй файл

Заголовок:

#import "ViewController.h"
@interface NewClass : ViewController 
-(void) setLabelText ;
@end

Реализация:

#import "NewClass.h"
@implementation NewClass
- (void) setLabelText {
    myLabel.text = @"NewClass text!";
}
-(id)init { 
    self = [super init];                                       
    if (self != nil) {                                         
    }
    return self;                           
}
@end

И я установил myLabel выход в IB.

Почему, когда я звоню [myClass setLabelText];, ничего не происходит?Там же остался "ViewController text!"на этикетке.Где моя проблема?Как я могу изменить ViewController::myLabel.text в NewClass

Ответы [ 4 ]

2 голосов
/ 13 декабря 2011

Это не наследство, которое вы делаете.В вашей реализации ViewController у вас есть следующий код

 NewClass *myClass = [[[NewClass alloc] init] autorelease];
[myClass setLabelText];

Это просто создание экземпляра класса NewClass и установка labelText для этого экземпляра.Вы никогда не отображаете его или не добавляете в представление.

0 голосов
/ 13 декабря 2011

Подождите ... судя по всему, у вас возникнут серьезные проблемы с переполнением стека: когда вы загружаете ViewController, он, в свою очередь, создает myClass.Поскольку myClass является подклассом ViewController, он, в свою очередь, создаст собственную переменную 'myClass' при загрузке ... и т. Д. Это будет продолжаться вечно или до тех пор, пока вы не получите ошибку переполнения стека.

На самом деле, яЯ довольно смущен вашим кодом.Возможно, пришло время переосмыслить то, что вы пытаетесь достичь и что должен делать ваш код?

0 голосов
/ 13 декабря 2011
NewClass *myClass = [[[NewClass alloc] init] autorelease];     
[myClass setLabelText]; 

Здесь вы создаете новый контроллер представления с помощью alloc / init (не обычно, если у вас есть резервный xib-файл для контроллера представления, вы обычно используете initWithNibName :), а затем устанавливаете свойство в IBOutlet. В этот момент розетка будет nil, так как вы не загрузили перо.

Кроме того, как отмечает Ник Булл, вы просто создаете экземпляр, а не отображаете его нигде. Таким образом, даже если вы использовали initWithNibName, вы не увидели бы ваши изменения, если бы вы как-то не представили контроллер представления.

0 голосов
/ 13 декабря 2011

Этот пример может помочь вам, где вы можете изменить текст метки, нажав на кнопку. Реализуйте приведенный ниже код в вашем примере

// class1.h

IBOutlet UILabel *text1;

@ свойство (неатомное, оставьте) UILabel * text1;

-(IBAction)press:(id)sender;

// class1.m

-(IBAction)press:(id)sender

{

Class2 *method = [[Class2 alloc]init];
NSString *string = [method sayhello];

[method release];
text1.text = string;

}

// class2.h

{

}

-(NSString *)sayhello;

@ end

// class2.m

-(NSString *)sayhello

{

return @ "hello";

}

кнопка подключения к владельцу файла ..

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