確かに、デリゲート メソッドを使用して、必要なことを行うことができます。デリゲート メソッドは、他のメソッドと同じように値を返すことができるため、次のようなことができます。この例では、テーブル ビューの選択された行からのデータを表示する ViewController にラベルがあります。ViewController のコードは次のとおりです。
@protocol DetailDelegate <NSObject>
-(NSString *)valueForNextOrPreviousCell:(NSInteger) nextOrPrevious;
@end
@interface ViewController : UIViewController
@property (weak,nonatomic) id <DetailDelegate> delegate;
@property (nonatomic) NSInteger selectedRow;
@property (strong,nonatomic) NSString *dataToDisplay;
@end
@interface ViewController ()
@property (weak,nonatomic) IBOutlet UILabel *label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.label.text = self.dataToDisplay;
}
-(IBAction)nextOrPreviousClicked:(UIBarButtonItem *)sender {
if ([sender.title isEqualToString:@"Next"]) {
self.selectedRow += 1;
}else{
self.selectedRow -= 1;
}
NSString *data = [self.delegate valueForNextOrPreviousCell:self.selectedRow];
self.label.text = data;
}
次に、TableController の prepareForSegue メソッドとデリゲート メソッドの実装では、次のようになります。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSInteger row = [self.tableView indexPathForSelectedRow].row;
ViewController *vc = segue.destinationViewController;
vc.delegate = self;
vc. selectedRow = row;
vc.dataToDisplay = self.theData[row];
}
-(NSString *)valueForNextOrPreviousCell:(NSInteger)nextOrPrevious {
if (nextOrPrevious < 0) nextOrPrevious = 0;
if (nextOrPrevious >= self.theData.count -1) nextOrPrevious = self.theData.count - 1;
return self.theData[nextOrPrevious];
}