1

私はテーブルビューとシングルトンクラスを探していましたが、解決策が見つからなかったので、ここにいます.

ユーザーが行を選択すると、ビューコントローラーにテーブルビューがあり、選択したデータをシングルトンクラスの配列に送信し、別のビューコントローラーで画面に出力します。

ここに私のシングルトンクラスコードがあります:

#import <Foundation/Foundation.h>


@interface DataController : NSObject {
    NSArray* standLoc;
}

@property (readonly)NSArray* standLoc; // stand location 

+(DataController*)sharedInstance;

@end


#import "DataController.h"

@implementation DataController

@synthesize standLoc;

+(DataController*)sharedInstance
{
    static DataController* sharedInstance = nil;
    if (!sharedInstance)
    {
        sharedInstance = [[DataController alloc]init];
    }
    return sharedInstance;
}

@end

では、どうすればシングルトン クラスの配列にデータを渡せばいいのでしょうか。

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {

    StartHuntViewController *startHuntController = [[StartHuntViewController alloc] initWithNibName:@"StartHuntView" bundle:nil];

    DataController* sharedSingleton = [DataController sharedInstance];
    sharedSingleton = [stands objectAtIndex:indexPath.row];

    startHuntController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:startHuntController animated:YES];;


    [startHuntController release];
    startHuntController =nil;
}

デバッグでは、選択した項目が sharedSingleton にあることがわかりますが、それを NSArray* standLoc に渡すにはどうすればよいですか?

編集


SO私は自分のコードを編集しましたが、今は複数のコントローラービューで正常に動作します

私のシングルトン .m および .h :

#import <Foundation/Foundation.h>


@interface DataController : NSObject {
    NSString* standLoc;
}

@property (nonatomic,retain)NSString* standLoc; // stand location 

+(DataController*)sharedInstance;
-(void) setData: (NSString *) data;

@end
#import "DataController.h"


@implementation DataController


static DataController* sharedInstance = nil;

@synthesize standLoc;

+(DataController*)sharedInstance
{

    @synchronized (self) { //this ensure this methods will not be called at the same time..
        if(sharedInstance == nil){
            [[self alloc] init];
        }
    }
    return sharedInstance;
}
+(id) allocWithZone:(NSZone *)zone{
    @synchronized (self){
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];
            return sharedInstance;
        }
    }
    return nil;
}
-(id)copyWithZone:(NSZone *)zone{ // incase if we want to copy our singleton instance
    return self;
}
//to protect singleton from deallocation, we need to override some functions of memory allocation
-(id) retain {
    return self;
}

-(id) autorelease{
    return self;
}
-(NSUInteger ) retainCount{
    return NSUIntegerMax;
}

-(id) init{ // lets set the default data in it
    @synchronized (self){
        [super init];
        standLoc = [[NSString alloc] initWithString:@"Stand Loc"];//for performance, as we expect 5 digits from server, it's size was set to another 5 digits..
        return self;
    }
}
-(void) setData: (NSString *) data{ // this is the function to set static data which is the member of the class, reaching data will be allowed with this method
    @synchronized (self){
        if (standLoc != data) {
            [standLoc release];
            standLoc = [data retain];
        }
    }
}
-(NSString *) standLoc{
    @synchronized(self){
        return standLoc;
    }
}

singleton にデータを渡すには:

DataController* sharedSingleton = [DataController sharedInstance];
    NSString* transfer = [stands objectAtIndex:indexPath.row];
    [sharedSingleton setData:transfer];
4

3 に答える 3

0

なぜシングルトンが必要なのですか?あるViewControllerから次のViewControllerにデータを直接渡すだけで、コードの保守が簡単になります。ナビゲーションコントローラーを使用しているようです。テーブル内のセルをタップすると、テーブルのビューコントローラーが次のような新しい詳細コントローラーをプッシュできるようになります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:nil bundle:nil];
    detailViewController.data = [tableData objectAtIndex:[indexPath row]];
    [self.navigationController pushViewController:detailController animated:YES];
}
于 2012-04-06T00:58:50.993 に答える
0
  • 他のクラスから更新したい場合は、standLoc を読み取り専用にしないでください。
  • 「スタンド」から 1 つのオブジェクトを渡す場合、standLoc を配列にする必要があるのはなぜですか?
  • 必要な構文の種類 (上記の 2 つの点を解決した後) は次のとおりです。

    DataController* sharedSingleton = [DataController 共有インスタンス];

    sharedSingleton.standLoc = // シングルトンにあるデータ要素が何であれ;

于 2012-04-06T01:06:17.417 に答える
0

@ Synchronized を使用している理由は何ですか?

(iOSではめったに使用されません..)とにかく、(非アトミック)を使用してから@synchronizedを使用している場合、少し奇妙に思えます..

それでは、Apple コンパイラがより適切に機能するようにしましょう。

( https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html )

プロパティはデフォルトでアトミック デフォルトでは、Objective-C プロパティはアトミックです。

@interface XYZObject : NSObject @property NSObject *implicitAtomicObject; // デフォルトでアトミック @property (atomic) NSObject *explicitAtomicObject; // 明示的にアトミック @end とマークされています。これは、アクセサーが異なるスレッドから同時に呼び出された場合でも、合成されたアクセサーが、getter メソッドによって値が完全に取得されるか、setter メソッドによって完全に設定されることを常に保証することを意味します。

最後の注意: Apple が言うように、ロックやアトミックなどを使用しても、異なるスレッドからのデータへのディープ アクセスを保証するものではありません。

配列があり、それ(その参照..)をアトミック/同期で保護する場合、含まれるオブジェクトではなく、配列へのアクセスを保護します。(細心の注意を払って手動でロックする必要があります...競合状態が発生する可能性があります...)

于 2016-12-29T07:15:24.380 に答える