Plz コード ヘルプ 誰でもそのタスクの実行方法を教えてもらえますか? メイン画面でユーザーがサッカー選手を選択し、テーブル ビュー セルの 2 番目の画面でユーザーが特定の行を選択し、その行を保存してメイン ビューに戻ります。メイン ビューでは、特定の行のビデオが表示されます。基本的に、特定の行の選択について知りたいのですが、その選択をテーブルビューに保存し、メイン画面に内容を表示します。
4 に答える
以下のコードを実行すると、デリゲートの概念が実装され、質問の解決策も実装されます。これが役立つことを願っています:)
//in your main view controller
#import "ViewController.h"
#import "FootBallPlayersViewController.h"
@interface ViewController ()<FootballPlayerDelegate>//confirms to this delegate
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)whenSelectButtonClicked:(id)sender
{
FootBallPlayersViewController *controller = [[FootBallPlayersViewController alloc]initWithNibName:@"FootBallPlayersViewController" bundle:nil];
controller.delegate = self; //u must set to self
[self presentViewController:controller animated:YES completion:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)selectedFootBallPlayer:(NSString *)player
{
//implementation of your delegate method
//hear u are getting the football player name and u can continue further hear
NSLog(@"%@",player);
if([player isEqualToString:@"player1"])
{
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[aButton setTitle:player forState:UIControlStateNormal];
[aButton addTarget:self action:@selector(whenFirstPlayerButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; //add the target to self for click events
aButton.frame = CGRectMake(50, 50, 200, 55);
[self.view addSubview:aButton];
}
else
{
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[aButton setTitle:player forState:UIControlStateNormal];
aButton.frame = CGRectMake(50, 105, 200, 55);
[aButton addTarget:self action:@selector(whenSecondPlayerButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; //same hear
[self.view addSubview:aButton];
}
}
//now define the action methods
- (void)whenFirstPlayerButtonClicked:(UIButton *)sender
{
NSLog(@"player 1 video start");
}
- (void)whenSecondPlayerButtonClicked:(UIButton *)sender
{
NSLog(@"player 2 video start ");
}
@end
テーブルビューを含むビューで、このようなことをします
//FootBallPlayersViewController.h 内
#import <UIKit/UIKit.h>
@protocol FootballPlayerDelegate <NSObject> //define a protocol named FootballPlayerDelegate
- (void)selectedFootBallPlayer:(NSString *)player;
@end
@interface FootBallPlayersViewController : UIViewController
{
NSArray *players;
NSString *selectedPlayer;
}
@property (retain, nonatomic) IBOutlet UITableView *playerTable;
@property (nonatomic, assign) id<FootballPlayerDelegate>delegate; //create a delegate
@end
あなたのFootBallPlayersViewController.m
ファイルに
#import "FootBallPlayersViewController.h"
@interface FootBallPlayersViewController ()<UITableViewDataSource,UITableViewDelegate>
{
}
@end
@implementation FootBallPlayersViewController
@synthesize delegate; //synthesizing the delegate
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
players = [[NSArray alloc]initWithObjects:@"player1",@"player2", nil];
// players = [[NSArray alloc]initWithObjects:@"player1","player2", nil];
// Do any additional setup after loading the view from its nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc
{
[players release];
[_playerTable release];
[super dealloc];
}
- (IBAction)whenDoneButtonClicked:(id)sender {
//when done button clicked -->
//send a delegate to main controller
if([self.delegate respondsToSelector:@selector(selectedFootBallPlayer:)])//to avoid crash
{
[self.delegate selectedFootBallPlayer:selectedPlayer]; //call the delegate method hear
}
//dismiss the view
[self dismissViewControllerAnimated:YES completion:nil];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return players.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"cell"];
if(cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = [players objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//u can manage check mark and all, i am getting the selected player name
selectedPlayer = [players objectAtIndex:indexPath.row];
}
@end
これを達成するための良い方法:
- カスタム デリゲート
NSNotificationCenter
NSUserDefaults
(編集:不要なディスク書き込み)- 共通の NSObject サブクラスを維持し、データを更新する
-willAppear
他の方法:
- データベース(Core Data / SQLite)またはplist(あなたのケースには重すぎる)(編集:不要なディスク書き込み)
UIPasteBoard
デリゲートの簡単なチュートリアル:
パート 1: デリゲートの作成
UITableViewController
これが、私が名前を付けたサブクラスの .h にあるとしますYourTableViewControllerClassName
//declare the protocol
@class YourTableViewControllerClassName;
@protocol YourTableViewControllerClassNameDelegate <NSObject>
//@required //uncomment to specify required delegate methods as below
//- (void)requiredMethodNotUsedForThisExample;
@optional
- (void)selectedRow: (NSString *)selectedObj;
@end
@interface YourTableViewControllerClassName : UITableViewController
//declare a weak property to store any object
@property (nonatomic, weak) id <YourTableViewControllerClassNameDelegate> delegate;
@end
これが-didSelectRowAtIndexPath
対応するUITableViewController
サブクラスの であるとします。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//the following line is the main thing and can be called
//in any method within this class (placed wisely)
if([[self delegate] respondsToSelector:@selector(selectedRow)]) { //avoid crash
[[self delegate] selectedRow:cell.textLabel.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
パート 2: デリゲートの実装
UIViewController
これが前のサブクラスのどこかにあるコードであるとします。
//call this method somewhere
-(void)pushMyTableViewController
{
//declare "UILabel lblText;" in the .h of this class
//lblText = [UILabel alloc] init];
//[lblText setFrame: CGRectMake(0,0,100,35)];
//[self.view addSubview:lblText];
YourTableViewControllerClassName *tvcObj = [[YourTableViewControllerClassName alloc] init];
//for the following line, remember to declare
//<YourTableViewControllerClassNameDelegate> in the .h of this class
//hence declaring that this class conforms to the delegate protocol
[tvcObj setDelegate:self];
[self.navigationController pushViewController:tvcObj animated:YES];
}
UIViewController
これは、前のサブクラスで実装できるデリゲート メソッドになります。
#pragma mark - Optional YourTableViewControllerClassName Delegate Methods
-(void)selectedRow:(NSString *)selectedObj
{
[lblText setText:selectedObj];
}
UITableViewController
注:サブクラスから選択した行に応じてラベルを設定するだけなので、これは特定の問題を解決しません。
ポイントは、委任がどのように機能するかを示すことでした。
また、前のクラスで を取得しcell.textLabel.text
て設定できる場合UILabel
は、適切な場所 (主に 内のメソッド@protocol
) で変更を行い、代わりに選択したアイテムの配列インデックスまたは任意のオブジェクト/変数/その他を渡すことができます。それはあなたの人生を楽にします
*もっと簡単なものが必要な場合はNSNotificationCenter
、またはNSUserDefaults
多分UIPasteBoard
(それがボートを浮かせる場合)を選択してください
簡単な解決策... 初心者なので、各ポイントを明確にしています。
最初に AppDelegate.h でプロパティを作成します
@property int selectedRow;
テーブル ビュー画面である 2 番目の画面で選択した indexpath.row を保存し、AppDelegate.h もインポートします。
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; self.appDelegate.selectedRow=indexPath.row; //saving the row }
メイン画面のviewWillAppear()で
-(void)viewWillAppear:(BOOL)animated { if(self.appDelegate.selectedRow!=-1)//check wether row is selected or not { //action to show the specific row videos } }