2012-03-12 2 views
0

Я пытаюсь использовать iOS StackPanel, найденный here в моем собственном проекте.Невозможно присвоить значение переменной в Objective-C для iOS

Я включил файлы Stackpanel. * В свой проект и протестировал функциональность, я скопировал демо-код, который включен в файл AppDelegate исходного проекта в мой проект, как действие для нажатия кнопки. Проблема в том, что я не могу установить значение self.stackPanel (или использовать [self setStackPanel :). В любом случае, значение self.stackPanel остается ноль.

Соответствующие разделы кода ниже:

// From StackPanelAppDelegate.h (copied to MyViewController.h) 
#import "StackPanel.h" 

@interface MyNavViewController : UIViewController <UITextFieldDelegate> 
{ 
    StackPanel *stackPanel; 
} 
@property(strong, nonatomic) IBOutlet StackPanel *stackPanel; 
@end 

// From StackPanelAppDelegate.m (copied to MyViewController.m) 
#import "StackPanel.h" 

@implementation MyNavViewController 
@synthesize stackPanel; 

-(IBAction)myButtonPress:(id)sender 
{ 
    // Doesn't set correctly 
    self.stackPanel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    ... 
    // More code that adds things to the StackPanel 
} 

Я знаю, что Alloc и initWithFrame: методы работают правильно, потому что я создал еще один StackPanel * и может установить его значение на результат initWithFrame :. Другими словами,

-(IBAction)myButtonPress:(id)sender 
{ 
    // This works 
    StackPanel* panel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    ... 
    // More code that adds things to the StackPanel 
} 

Я пропустил что-то основное здесь, что не позволит мне установить значение свойства stackPanel?

Единственное, что у меня есть, это то, что исходный код не использует ARC, но мой проект делает, поэтому я удалил все операторы release и retain, чтобы сохранить компилятор счастливым. Я довольно новичок в ARC, но могут ли эти изменения повлиять?

+0

Вы абсолютно уверены, что '-myButtonPress:' в оригинале называется? Установите точку останова, чтобы убедиться. – JeremyP

+0

Вместо удаления сохранения/освобождения добавьте '-fno-objc-arc' в' Targets => Build Phases => Compile Sources => StackPanel.m', чтобы исключить этот класс из ARC, затем повторите попытку. –

+0

Еще одно примечание: не должна ли высота кадра быть 460 вместо 480 (из-за строки состояния)? –

ответ

-1

Вы пробовали это? Не знаете, зачем вам нужно использовать себя?

@property(nonatomic, retain) IBOutlet StackPanel *stackPanel; 

.... 

stackPanel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
+0

Разве это не то же самое, что и self.stackPanel? Когда вы говорите «не знаете, зачем вам нужно использовать себя», не могли бы вы объяснить дальше? Я просто пытаюсь понять вашу точку лучше. – ktambascio

+0

Пробовал это, но все равно не повезло. – jproch

0

Я, наконец, получил это. Это скорее проблема отладчика, чем проблема с фактическим кодом.

Для кого-то, кто может бороться с подобным вопросом, вот несколько вещей, которые я узнал об этом приключении:

Objective-C требует, self ключевого слова при использовании свойства. Другими словами:

self.stackPanel = [[StackPanel alloc] init]; // Sets value of stackPanel property 
stackPanel = [[StackPanel alloc] init]; // Sets value of stackPanel instance variable 

Они, как правило, одинаковы, так как @synthesize stackPanel создает переменную подкладочный под названием stackPanel. Проблема возникла из-за того, что код StackPanel, который я пытался использовать, также имел отдельную объявленную переменную, называемую stackPanel, которая маскировала синтезированную опорную переменную. Так что в моем случае stackPanel и self.stackPanel указали на 2 разных места в памяти.

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

Для менее бесполезного отладчика перейдите к Product -> Edit Schemes в Xcode и выберите Run Название проекта с левой стороны. Установите отладчик в GDB, если он еще не установлен. Это должно получить более полезные результаты, пока мы ждем, когда Apple завершит отладку своего отладчика.

Смежные вопросы