Objective-C: Class1 (alloc init) usulidan 2-chi sinfning chaqiruvi ishlamayapti

GameScreen.m faylida quyidagi usulni o'zim e'lon qildim - GameScreen.h faylida (void) drawNumbers:

//GameScreen.h
#import 

@interface GameScreen : UIView
{
  IBOutlet UIButton *cell00;
}
- (void) drawNumbers;
- (IBAction) onCellClick:(id)sender;
@property (nonatomic, retain) IBOutlet UIButton *cell00;

@end



//GameScreen.m

#import "GameScreen.h"
- (void) drawNumbers
{
   //testing if this works, so far it doesn't
   [cell00 setTitle:@"Whatever" forState:UIControlStateNormal];
   [cell00 setTitle:@"Whatever" forState:UIControlStateHighlighted];
}

Ushbu usulni mening GameScreenViewController.m faylidan quyidagi tarzda chaqirishga harakat qilaman:

//GameScreenViewController.m

#import "GameScreenViewController.h"
#import "GameScreen.h"
... 
- (void) viewDidLoad
{
   GameScreen *aGameScreen = [[GameScreen alloc] init];
   [aGameScreen drawNumbers];
   [aGameScreen release];

   [super viewDidLoad];
}

Bu GameScreenViewController.m ning viewController va GameScreen sinfining barcha tugmachalarini bosgan, ishlayotgan taymerlarni olayotgan voqea ishlovchisi bo'lgan GameScreen.xib faylidagi tugmani sarlavhasini o'zgartirishi kerak. [DrawNumbers ] [viewDidLoad] dan boshlab, men ekranning oldinga tarjima qilinganda (ekran boshqaruvi AppDelegate fayllari orqali amalga oshiriladi) o'zgartirilishini xohlayman.

Eđer, men, xuddi shu sinf ichidan drawNumbers örneđini chaqirsam

//GameScreen.m

#import GameScreen.h
-(void) onButtonClick:(id)sender
{
    //some other code

    [self drawNumbers];
}

u ishlaydi (kodni amalga oshirish yoki grafik interfeysi bilan hech qanday noto'g'ri).

Men "Apple Guide" va internet sahifalarida tonnagacha ko'zdan kechirdim, ammo bunga biron bir yorug'lik topa olmayapman. Har qanday qo'shimcha yordam (ADGda aniq javobni qaerda topish mumkinligi haqidagi javoblarni o'z ichiga olgan holda), albatta, juda minnatdor bo'lardi.

(O'zgartirish: bu erda AppDelegate kodi aniq ko'rinishga aylantiriladi).

//myAppAppDelegate.h
#import 
@class myAppViewController, GameScreenViewController;
@interface myAppDelegate : NSObject 
{
    UIWindow *window;
    myAppViewController *viewController;
    GameScreenViewController *gameScreenViewController;
}

- (void) flipToGameScreen;

@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) GameScreenViewController *gameScreenViewController;
@end

//myAppAppDelegate.m
-(void) flipToGameScreen
{
    GameScreenViewController *aGameScreenView = [[GameScreenViewController alloc] initWithNibName: @"GameScreen" bundle:nil];
    [self setGameScreenViewController:aGameScreenView];
    [aGameScreenView release];
    [gameScreenViewController.view.frame = [[UIScreen mainScreen] applicationFrame];
    [viewController.view removeFromSuperview];
    [self.window addSubview:[gameScreenViewController view]];
}
0
Iltimos, GameScreen.h tarkibini joylashtirasizmi?
qo'shib qo'ydi muallif Suhail Patel, manba
GamesViewController.m viewDidLoad usulida ushbu qatorni o'zgartiring [GameScreen release]; [aGameScreen release] uchun;
qo'shib qo'ydi muallif denil, manba
GameScreen ilovasida cell00 instance değişkeni nasıl ayarlanır? Bu erda bu erda ko'rsatilmagan va siz -drawNumbers usulini chaqirgan paytda nil bo'lishi mumkin.
qo'shib qo'ydi muallif user23743, manba
so'ralgan tarzda tahrirlangan. u erda hujayra namunasi o'zgaruvchisini ham ko'rishingiz mumkin.
qo'shib qo'ydi muallif Mario, manba
Bu yerda men juda yomonman. tushuntirish tahrirlangan. AppDelegate fayliga kerakmi?
qo'shib qo'ydi muallif Mario, manba

1 javoblar

Agar cell00 ni NIB tomonidan belgilanadigan bo'lsa, [[GameScreen alloc] init] ni ishlatasiz. U faqat tegishli NIB o'rnatilgan bo'lsa (va aloqa o'rnatilganda) o'rnatiladi.

Hujayoga viewDidLoad orqali kirsa, GameScreen da bir xususiyat yarating va uni (yoki maxsus initWithCell: ).

GameScreenViewController saytida IBOutlet GameScreen * aGameScreen; kabi bir narsa mavjud bo'lsa (va ayni NIBda cell00 ga ulanish o'rnatilgandagina) Buning o'rniga kirish.

0
qo'shib qo'ydi
Agar NIB/XIB serileştirilmiş dir. Buning ma'nosi shundaki, barcha ob'ektlar kodi bilan kodlangan ( NSCoder orqali) va assotsiatsiyalar/ulanishlar o'rnatish vaqtida amalga oshiriladi. Siz bajargan viewDidLoad ga kirgandan so'ng. Siz yaratgan barcha narsalar NIB/XIB bilan hech qanday aloqasi yo'q. Agar siz [[GameScreen alloc] init] ni qilsangiz, ushbu namunadagi IBOutlet s hech biriga ulanmaydi. Barcha Nib fayllarini qismi Resurs dasturlash uchun qo'llanma .
qo'shib qo'ydi muallif DarkDust, manba
Keyin men uni qabul qilmayman; agar barcha ko'rinishlar AppDelegate-dan ma'lum usul - (void) fliptoScreenX orqali kiritilsa va ko'rinish qo'shilsa, viewController va sinf xib ko'rsatilganda sinfga o'rnatiladi, chunki viewController File Owner va GameScreen bilan bog'liq ko'rinishmi?
qo'shib qo'ydi muallif Mario, manba
"Kichkina" vaqtinchalik echim: agar menda IBOutletlar ViewController klassi va GameScreen sinfida IBActions bo'lsa edi, u ishlaydi? Men 20 ta tugmachani bosdi, ya'ni barcha o'zgaruvchilarni ikki barobarga oshirishni anglatadi, yaxshi narsa emas ... OK ("toza va sodda" nuqtai nazaridan)?
qo'shib qo'ydi muallif Mario, manba
Maslahat uchun rahmat, men uni juda qadrlayman. Buni qiladigan bo'lsak, men kodimni biroz burish uchun qaror qildim: AppDelegate menejeri sifatida ishlaydi, ViewControllers chiqdi sifatida harakat qiladi va sinflar kirish sifatida harakat qiladi. Shunday qilib, men MVC modeliga sodiq qolaman va toza kodga ega bo'laman ... yana bir marta rahmat.
qo'shib qo'ydi muallif Mario, manba