0

我正在尝试编写一个简单的自定义委托来显示多选列表(在参考了各种在线教程、stackoverflow、Apple doc 之后),但是在我想使用委托的类中,我设置委托的行进入了无限循环当我运行它时。

我在这里分享了源代码 https://bitbucket.org/ikosmik/uilistviewcontroller/src/ddfcd140b52e6e59d84e58d34d601f8f850145a1/UIList?at=master

UIListViewController(我在哪里声明协议) https://bitbucket.org/ikosmik/uilistviewcontroller/src/ddfcd140b52e6e59d84e58d34d601f8f850145a1/UIList/UIListViewController.h?at=master

我试图在名为 View_Exporter 的 UIViewController 中使用委托

#import <UIKit/UIKit.h>
#import "UIListViewController.h"

@interface View_Exporter : UIViewController <UIListViewDelegate, UIListViewDataSource>

  @property (nonatomic, strong) IBOutlet UIView *viewForList; 
  @property (nonatomic, strong) UIListViewController *listViewController;

@end

View_Exporter.m

#import "View_Exporter.h"


@implementation View_Exporter

@synthesize arraySelectedList;
@synthesize viewForList;
@synthesize listViewController;



#pragma mark - UIListViewController Methods

-(NSArray *) itemsForList {
    NSLog(@"View_Exporter itemsForList");
    NSArray *array = [NSArray arrayWithObjects:@"Server", @"Memory", nil];
    return array;
}


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.listViewController = [[UIListViewController alloc] initWithNibName:@"UIListViewController" bundle:nil];
    self.listViewController.listViewDelegate = self;
    //[self.viewForList addSubview:self.listViewController.view];
    self.listViewController.listViewDataSource = self;

}

@end

但是当我运行代码时, viewDidLoad 中的这一行似乎无限循环:

self.listViewController.listViewDelegate = self;

为什么会无限循环?从昨天开始我就在这件事上头破血流。不知道哪里出错了。有人可以帮忙吗?

4

1 回答 1

2

您已经为 编写了一个自定义设置器listViewDelegate,在此方法结束时您执行以下操作:

self.listViewDelegate = delegate;

这只是再次调用 setter 方法。通过访问属性self.只是调用的一种方式[self setXX:xxx]。在您的访问器方法中,您需要直接设置实例变量,在正常情况下,这只是

_delegate = delegate;

(_delegate 实例变量会自动为您创建)。您可以安全地删除所有综合语句,不再需要它们。

于 2013-08-05T06:22:10.420 回答