0

基本は次のとおりです。

1 つの UIDatePicker で 2 回 (NSDate) を制御する必要があります。必要なアイテムをいじり始めるためだけに、XCode (v 4.4.1) で新しいシングル ビュー プロジェクトを作成しました。プロジェクトの作成にストーリーボードを使用しました。簡単です。ストーリーボードでは、View Controller を取り除き、Navigation Controller をドラッグしました。ルート ビュー コントローラーであったテーブル ビューを削除し、通常のビュー コントローラーをルート ビュー コントローラーとして追加しました。そこにボタンを配置します。別のView Controllerをドラッグして、「Push」を使用してルートView Controllerのボタンをこの新しいView Controllerに接続しました。とてもシンプルです。私はそれをテストしました、それは動作します、基本的です。

追加したばかりの新しいビュー コントローラーのクラスを作成し、ストーリーボードのビュー コントローラーをそのタイプに設定します。次に、ストーリーボードに UIDatePicker、UIButton、および UITableView を追加します (これは、物事を機能させようとして、すべてを使用する方法を学ぼうとしているだけであり、まだまったく新しいものであることに注意してください)。

私の ViewController クラスのコードは次のとおりです。

NewViewController.h

#import <UIKit/UIKit.h>

@interface Reminders : UIViewController <UITableViewDataSource, UITableViewDelegate> {
NSInteger selectedRow;
}

@property (nonatomic, retain) NSDate *amTime;
@property (nonatomic, retain) NSDate *pmTime;

@property (nonatomic, retain) IBOutlet UITableView      *tbl;
@property (nonatomic, retain) IBOutlet UIDatePicker *picker;

- (IBAction)timeChange:(id)sender;
- (IBAction)pickerChange:(id)sender;

- (NSString *)dateAsString: (NSDate *)date;

@end

NewViewController.m

#import "Reminders.h"

@interface Reminders ()

@end

@implementation Reminders

@synthesize tbl, picker;
@synthesize amTime, pmTime;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
    NSLog(@"init");

}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"did load");

amTime = [NSDate date];
NSLog(@"AM time viewDidLoad: %@", [self dateAsString:amTime]);

pmTime = [NSDate date];
NSLog(@"PM time viewDidLoad: %@", [self dateAsString:pmTime]);

selectedRow = (NSInteger)1;
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}





-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}


-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
return 3;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//NSLog(@"cell for row");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"MyIdentifier"];
}

if (indexPath.row == 0) {
    cell.textLabel.text = @"Dose";
    cell.detailTextLabel.text = @"120";
}
else if (indexPath.row == 1) {
    cell.textLabel.text = @"AM";
    //cell.detailTextLabel.text = @"time am";

    cell.detailTextLabel.text = [self dateAsString:amTime];

}
else if (indexPath.row == 2) {
    cell.textLabel.text = @"PM";
    //cell.detailTextLabel.text = @"time pm";

    cell.detailTextLabel.text = [self dateAsString:pmTime];
}

if (selectedRow == indexPath.row) {
    [tbl selectRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:0] animated:NO scrollPosition:0];
}

return cell;
}


-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) {
    selectedRow = 0;
}
else if (indexPath.row == 1) {
    selectedRow = 1;
    [picker setDate:amTime];
}
else if (indexPath.row == 2) {
    selectedRow = 2;
    [picker setDate:pmTime];
}
}


- (IBAction)timeChange:(id)sender {
if (selectedRow == 1) {
    amTime = [NSDate date];
    NSLog(@"time change: %@", [self dateAsString:amTime]);
}
else if (selectedRow == 2) {
    pmTime = [NSDate date];
    NSLog(@"time change: %@", [self dateAsString:pmTime]);
}
else {

}

[tbl reloadData];
}

- (IBAction)pickerChange:(id)sender {
if (selectedRow == 1) {
    amTime = [picker date];
    NSLog(@"PICKER time change: %@", [self dateAsString:amTime]);
}
else if (selectedRow == 2) {
    pmTime = [picker date];
    NSLog(@"PICKER time change: %@", [self dateAsString:pmTime]);
}
else {
    NSLog(@"picker does NOTHING");
}

[tbl reloadData];
}

- (NSString *)dateAsString:(NSDate *)date {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *stringFromDate = [formatter stringFromDate:date];

return stringFromDate;

}

はい、時間を変更しているボタンと日付ピッカーの両方のアクションがあり、ボタンと対応するアクションが存在する理由は、思ったように動作させることができなかったときに何かを追加し始めたためです。それは働いていたはずです。

ともかく。時間は順調に始まったようですが、検査でわかるように、いくつかの点で無効なobjective-cオブジェクトが作成されています。「amTime」をセルの詳細テキストに入れようとすると、cellForRowAtIndexPath メソッドでチョークします。

ここにキッカーがあります....上記と同じ手順、同じコード(コピーを貼り付けたもの)を使用して、別のマシン(適切なコード署名キーを持つマシン)で同じアプリを作成しました。現在のマシンでそのプロジェクトを実行します。現在のマシンでプロジェクトを作成すると、クラッシュします。

文章が長くなってしまい申し訳ありませんが、できるだけ詳しくお伝えしたいと思います。

4

2 に答える 2

0

変数の割り当てが早すぎるようです。変数を保存amTimepmTimeてインスタンス化し、コードで変数にアクセスしますself.amTimeself.pmTimeこれらはプロパティであるため、getters/settersメソッドは適切に保持/解放します。

raywenderlich.comには、iOS開発におけるメモリ管理の基本を説明する素晴らしい3部構成のチュートリアルがあります。必読です。

http://www.raywenderlich.com/2657/memory-management-in-objective-c-tutorial

于 2012-08-14T04:27:53.393 に答える
0

ARD は、私の側ではそれほど努力せずにトリックを実行しましたが、ARC がなければ、amTime 変数と pmTime 変数にいくつかの保持を投入するだけの問題でした。

于 2012-08-27T13:39:46.730 に答える