0

我正在尝试从完全 Android 的背景中学习 iOS。很抱歉这个超级菜鸟问题,但我想构建一个 UIPickerView Util 类,它可以在我的应用程序中作为一个单独的类一遍又一遍地重用,我收到EXC_BAD_ACCESS消息,我不知道为什么。所以我有两个问题:

  1. 我没有看到任何关于将它作为不同的类分开的东西,这是因为这是处理这个问题的不正确方法吗?

  2. 这个基本(主要是生成的)代码会给我 EXC_BAD ACCESS 消息有什么问题?我读过这与内存问题有关。我正在使用 ARC,为什么这是一个问题?

这是我正在尝试构建的课程的开始。

头文件

#import <UIKit/UIKit.h>

@interface PickerTools : UIViewController<UIPickerViewDelegate>

@property (strong, nonatomic)UIPickerView* myPickerView;

-(UIPickerView*)showPicker;

@end

实施文件

#import "PickerTools.h"

@implementation PickerTools

@synthesize myPickerView;

- (UIPickerView*)showPicker {
    myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
    myPickerView.delegate = self;
    myPickerView.showsSelectionIndicator = YES;
    return myPickerView;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:        (NSInteger)component {
    // Handle the selection
}

// tell the picker how many rows are available for a given component
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    NSUInteger numRows = 5;

    return numRows;
}

// tell the picker how many components it will have
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

// tell the picker the title for a given component
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *title;
    title = [@"" stringByAppendingFormat:@"%d",row];

    return title;
}

// tell the picker the width of each row for a given component
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    int sectionWidth = 300;

    return sectionWidth;
}

@end

这是我从 UITableViewController 类中的方法调用它的方式:

PickerTools *picker = [[PickerTools alloc]init];
[[self view]addSubview:[picker showPicker]];

再次感谢您的帮助!只是想学习!

4

1 回答 1

0

你在用 showPicker 做什么?showPicker 具有误导性,因为它实际上并未显示。它只返回一个带有框架的pickerView。在某些时候,您需要使用 addSubview 或使用 UIPopoverController 将其添加到视图中。

如果您只是在方法范围内创建视图控制器类,那么一旦该方法完成运行,它就会被释放。然后所有的赌注都取消了。选择器正在尝试访问委托(即视图控制器),但视图控制器无处可寻,因为它已被释放。

您必须发布一些使用代码。就其本身而言,此代码应该可以工作,但这就是您使用它的方式。

此外,您不必使用 UIViewController 来“控制”一个简单的视图。考虑制作一个自定义类并仅子类化 NSObject。

编辑:查看您发布的代码后,我的怀疑是正确的。您需要“保留”您的 PickerTools 实例。这意味着,您需要将“picker”变量(再次误导)保存为调用视图控制器的强属性。在您将选择器视图添加为子视图后,它会立即发布。pickerView 是活动的,因为它被它的 superview 保留,但是持有它的对象(委托“picker”)已经死了。有道理?

于 2012-11-26T23:36:52.850 回答