Objective-C: Выклік класа 2 экзэмпляры з class1 [Alloc INIT] спосаб не працуе

У мяне ёсць наступны метад у файле GameScreen.m, са сваёй уласнай дэкларацыі - (Несапраўднымі) drawNumbers на файл GameScreen.h:

//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];
}

Я спрабую выклікаць гэты метад з майго GameScreenViewController.m файла, такім чынам:

//GameScreenViewController.m

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

   [super viewDidLoad];
}

Гэта павінна змяніць назву кнопкі ў GameScreen.xib файл, дзе GameScreenViewController.m з'яўляецца клас ViewController і GameScreen з'яўляецца апрацоўшчыкам падзеі, дзе я атрымліваю ўсё пстрычкі кнопкі, таймеры працуе, і г.д. Я спрабую выклікаць [drawNumbers ] з [viewDidLoad], так як я хачу, каб назва будзе зменена, калі экран выхоўваецца фронт (кіраванне экранам ажыццяўляецца праз файлы AppDelegate).

Справа ў тым, калі я называю drawNumbers асобнік ўнутры таго ж класа праз

//GameScreen.m

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

    [self drawNumbers];
}

ён працуе (як сказаць, нічога дрэннага з рэалізацыяй коды або графічным інтэрфейсам).

Я прагледзеў кампаніі Apple Guide і тоны старонак у Інтэрнэце, але я не магу знайсці які-небудзь святло на гэта. Любая дадатковая дапамогу (у тым ліку адказаў, як, дзе менавіта знайсці адказ у ADG) сапраўды было б ацэнены.

(Пад рэдакцыяй: тут ідзе код AppDelegate пераварочваць з канкрэтным відам, на ўсякім выпадку):

//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
Ці можаце вы апублікаваць змесціва GameScreen.h?
дададзена аўтар Suhail Patel, крыніца
У вашым метадзе GamesViewController.m viewDidLoad змяніць гэты радок [GameScreen рэліз]; на [выпуск aGameScreen];
дададзена аўтар denil, крыніца
Як ваш cell00 асобнік зменнай у GameScreen усталяваны? Гэта не паказана тут, і гэта можа быць нуль у той час вы выклікаеце -drawNumbers метад.
дададзена аўтар user23743, крыніца
адрэдагаваны ў адпаведнасці з просьбай. вы можаце ўбачыць там зменную асобніка ячэйкі, а таксама.
дададзена аўтар Mario, крыніца
Памылка друку тут, мой дрэнны. Тлумачэнне змен. Вы б патрэбен файл AppDelegate, а?
дададзена аўтар Mario, крыніца

1 адказы

Так як ваш cell00 павінен быць усталяваны з дапамогай СИБ ён будзе нуль, калі вы проста зрабіць [[GameScreen Alloc] ініцыялізацыі] . Ён будзе ўсталяваны толькі калі загружаны адпаведны НСБ (і злучэнне фактычна створана).

Калі вочка можа быць даступная ў вашым viewDidLoad , стварыць ўласцівасць на GameScreen і перадаць яго праз ўласцівасць (або выдзелены initWithCell: ці нешта ).

Калі ў вас ёсць нешта накшталт IBOutlet GameScreen * aGameScreen; на GameScreenViewController (а таксама ўсталяваў злучэнне з cell00 ў тым жа СИБ) вы павінны доступу, замест гэтага.

0
дададзена
NIB/XIB з'яўляецца <я> Десериализованный . Гэта азначае, што ўсе аб'екты ў ім атрымліваюць дэкадуецца (праз NSCoder ) і асацыяцыі/злучэння выкананы <я> падчас загрузкі . Пасля таго, як вы дасягнеце viewDidLoad гэта зроблена. Усе аб'екты, якія атрымліваюць створаныя вамі тады не маюць ніякіх адносін з NIB/XIB. Калі вы [[GameScreen Alloc] ініцыялізацыі] , ні адзін з вашага IBOutlet s з гэтага асобніка не падлучыцца. Абавязкова прачытайце ўвесь NIB Files аб Праграмаванне рэсурсаў Кіраўніцтва .
Я не разумею тады; калі ўсе віды выклікаюцца з AppDelegate праз адмысловы метад - (Несапраўднымі) fliptoScreenX і выгляд дадаецца, а ня як ViewController і клас загружаюцца пры адлюстраванні XIB, паколькі ViewController звязана файла Уладальнік і GameScreen ў выгляд?
дададзена аўтар Mario, крыніца
«Маленькі» абыходны шлях: ён працаваў бы, калі б я меў IBOutlets на класе ViewController і IBActions на класе GameScreen? У мяне больш за 20 кнопак, гэта азначае, што ў два разы ўсе зменныя, не вельмі добрая рэч ... гэта нармальна (з пункту «трымаць яго ў чысціні і проста» гледжання)?
дададзена аўтар Mario, крыніца
Дзякуй за параду, я сапраўды цаню гэта. Ці будзе гэта зрабіць, тым часам я вырашыў пакруціць мой код няшмат: AppDelegate будзе працаваць у якасці мэнэджэра гледжання, ViewControllers будзе выступаць у якасці высновы, і класы будуць дзейнічаць у якасці ўваходных дадзеных. Такім чынам, я магу прытрымлівацца мадэлі MVC і да гэтага часу чысты код ... Яшчэ раз дзякуй, сапраўды.
дададзена аўтар Mario, крыніца