2012-04-22 3 views
0

Я запускаю UIPopoverViewController, который должен нарисовать две кнопки (кнопки добавления и удаления). ContentViewController для UIPopover имеет свойство outputJackView, которое устанавливается непосредственно перед запуском UIPopoverViewController. Это свойство необходимо для правильного рисования кнопок. Проблема сразу после того, как первая кнопка добавлена ​​как подзаголовок, outputJackView установлен как null как-то.Свойство null после добавления subview

Вот ContentViewController для UIPopoverViewController:

CableConnectionMenuController.h

#import <UIKit/UIKit.h> 
@class JackView; 

@interface CableConnectionMenuController : UIViewController 
{ 
JackView *outputJackView; 
} 

@property (nonatomic, weak) id <CableConnectionDelegate> delegate; 
@property (nonatomic, strong) JackView *outputJackView; 

- (void)setButtonTextWithOutputJack:(JackView *)outputJack withInputArray:(NSMutableArray *)inputArray; 
- (void)createAddConnectionButton; 
- (void)createDeleteConnectionButton; 
@end 

CableConnectionMenuController.m

#import "CableConnectionMenuController.h" 
#import "JackView.h" 
#import "CableDisconnectButton.h" 

@implementation CableConnectionMenuController 

@synthesize delegate; 
@synthesize outputJackView; 

...

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

//alloc output jack view 
self.outputJackView = [[JackView alloc] init]; 

//set size of popover view in cables view 
self.contentSizeForViewInPopover = CGSizeMake(200, 200); 

//change view background color 
self.view.backgroundColor = [UIColor whiteColor]; 
} 

//this method is called from the class that launches the UIPopoverViewController 
- (void)setButtonTextWithOutputJack:(JackView *)outputJack withInputArray:(NSMutableArray *)inputArray 
{ 
//set output jack which will be the same for all inputs 
self.outputJackView = outputJack; 

//draw add connection button 
[self createAddConnectionButton]; 

//draw delete connection button - not working 
//[self createDeleteConnectionButton]; 
} 

- (void)createAddConnectionButton 
{ 
CableDisconnectButton *addConnectionButton = [CableDisconnectButton buttonWithType:UIButtonTypeCustom]; 
addConnectionButton.frame = CGRectMake(0, 0, 190, 40); 
[addConnectionButton setBackgroundImage:[UIImage imageNamed:@"images/cable_connect_button.png"] forState:UIControlStateNormal]; 
[addConnectionButton setBackgroundImage:[UIImage imageNamed:@"images/cable_connect_button_over.png"] forState:UIControlStateHighlighted]; 

//add output jack 
addConnectionButton.outputJack = self.outputJackView; 

//add action to button 
[addConnectionButton addTarget:self action:@selector(addConnectionButtonTarget:) forControlEvents:UIControlEventTouchUpInside]; 

NSLog(@"output jack name before: %@", self.outputJackView.jackName); 

[self.view addSubview:addConnectionButton]; 

NSLog(@"output jack name after: %@", self.outputJackView.jackName); 
} 

Два NSLog's в конце вернут имя правильно на первом (до) и возвращают значение null во второй (после). Свойства jackName - это NSString. Очевидно, что свойство устанавливается равным null после добавления subview, но я не могу понять, почему это произойдет.

Вот метод из класса, который запускает UIPopoverViewController в случае, если это имеет значение:

- (void)editCableConnectionsWith:(JackView *)outputJack 
{ 
//launches the note menu popover 
self.cableConnectionMenuController = [[CableConnectionMenuController alloc] init]; 
self.cableConnectionMenuController.delegate = (id)self; 

//find appropriate connection to edit 
for (JackView *currentJack in jackArray) 
{ 
    if (currentJack == outputJack) 
    { 
     //create temp array of input jacks to send to cable connection controller 
     NSMutableArray *inputButtonTempArray = [self returnInputJackArrayWithOutputJack:currentJack]; 

     //set information for creating disconnect buttons in popover 
     [self.cableConnectionMenuController setButtonTextWithOutputJack:currentJack withInputArray:inputButtonTempArray]; 
    } 
} 

self.editConnectionsPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.cableConnectionMenuController]; 

[self.editConnectionsPopoverController presentPopoverFromRect:pulseRing.frame inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 
+0

После дальнейшего тестирования, кажется, что все свойства в этом UIViewController установлены равными null после добавления subview. Это действительно бессмысленно. – anthony

ответ

0

Как свойство jackName объявлен? Я предполагаю, что это слабая ссылка.

У меня была аналогичная проблема, когда слабая ссылка на представление была сброшена после того, как представление было добавлено как подзаголовок. Я понимаю, что слабая ссылка должна использоваться только тогда, когда есть потенциальный цикл удержания (например, у вас есть рюкзак со ссылкой на калькулятор, а калькулятор указывает на рюкзак - см. Big Nerd Ranch book).

Я не совсем понимаю, почему здесь проблема, но я столкнулся с чем-то похожим и решил, что поделюсь.

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