0

2つのボタン(追加ボタンと削除ボタン)を描画することになっているUIPopoverViewControllerを起動しています。outputJackViewUIPopoverのContentViewControllerには、UIPopoverViewControllerが起動される直前に設定されるというプロパティがあります。このプロパティは、ボタンを正しく描画するために必要です。問題は、最初のボタンがサブビューとして追加された直後で、outputJackViewどういうわけかnullに設定されています。

UIPopoverViewControllerのContentViewControllerは次のとおりです。

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);
}

最後の2つのNSLogは、最初のNSLog(前)で名前を正しく返し、2番目(後)でnullを返します。jackNameプロパティはNSStringのものです。サブビューが追加された後、プロパティがnullに設定されていることは明らかですが、なぜそうなるのか理解できません。

重要な場合に備えて、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];
}
4

1 に答える 1

0

jackNameプロパティはどのように宣言されますか?私の推測では、これは弱参照です。

ビューがサブビューとして追加された後、ビューの弱参照がリセットされるという同様の問題がありました。私の理解では、弱い参照は、潜在的な保持サイクルがある場合にのみ使用する必要があります(たとえば、電卓を参照するバックパックがあり、電卓がバックパックを指している場合は、Big Nerd Ranchの本を参照してください)。

なぜそれがここで問題になるのかはよくわかりませんが、似たようなものに遭遇し、共有したいと思いました。

于 2013-03-04T00:10:03.663 に答える