سؤال

مشكلتي هي الحصول على المعلومات من وحدة تحكم (والتي تصادف أنها ROOTVIEWCONTROLLER) إلى عرض آخر. في محاولة للوصول إليها من خلال مندوب التطبيق ، لم أتمكن من العمل. لقد وجدت كيفية القيام بذلك ، لكن هذا الإنصاف خلق مشكلة أخرى في الحصول على العرض داخل وحدة تحكم عرض مشروط لعرض البيانات فعليًا. لقد نشرت أدناه كل من معلومات AppDelegate ، ورمز حلول القاموس NSMutable لأولئك الذين قد يحتاجون إلى مساعدة أيضًا.

لقد حاولت لأكثر من أسبوع حل مشكلة ths بمفردي. انتهت مشكلتي هي كيفية الوصول إلى AppDelegate ، وهذا هو السبب في أنني كنت أواجه مشكلة مع NSDictionary. لذلك في النهاية ، لم تكن القضية هي NSDictionary ، على الرغم من أنني قد ذهبت إلى أبعد من ذلك ، لكان مشكلة أنا متأكد.

أولاً ، أود أن أشكر Techzen على مساعدتي في رؤية أنني قد انتهت من البرمجة ، وأوجهني في الاتجاه الصحيح.

هذا ما تعلمته.

قم بتعيين متغيرك في AppDelegate.

appdelegate.h

 @interface AppDelegate : NSObject  < UIApplicationDelegate, UINavigationControllerDelegate >
{   
    UIWindow *window;
    UINavigationController *navController;

    // Array to store the Makers Objects
    NSMutableArray *makers;

}

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navController;

@property (retain, nonatomic) NSMutableArray *makers;
@end

appdelegate.m

    - (void)applicationDidFinishLaunching:(UIApplication *)application 
{

    makers = [[NSMutableArray alloc] init] ;
}

في ViewController.m قم بتعيين المتغير إلى AppDelegate. لقد فعلت ذلك داخل وظيفة TableView DeSelectRowatIndexPath.

        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

// The line below loads it into the variable, the one above takes it and makes it available for other view Controllers.

       Maker *maker = (Maker *)[appDelegate.makers objectAtIndex:indexPath.row];

// the combination of the above and below also loads the information into another array in this view controller, defined in an NSObject Controller called Maker (.h and .m files)

      maker = [self.Makers objectAtIndex:indexPath.row];

الآن في وحدة التحكم في العرض ، تريد تحميل المتغير من AppDelegate ، قم بإعداده مثل هذا.

#import <UIKit/UIKit.h>

#import "AppDelegate.h"
#import "Maker.h"

@class AppDelegate;

@interface DetailsViewController : UIViewController
{

        AppDelegate *dappDelegate;
    DetailsViewController *detailsView;

    IBOutlet UITextView *makerDescription;

}

@property (retain, nonatomic) AppDelegate *dappDelegate;

@property (nonatomic, retain) DetailsViewController *detailsView; 

@property (nonatomic, retain) IBOutlet UITextView *makerDescription;

@end

وفي ملف ViewController.M ؛

#import "DetailsViewController.h"
#import "AppDelegate.h"

@synthesize dappDelegate;

- (void)viewWillAppear:(BOOL)animated // or ViewDidLoad not sure which is better.

    dappDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    NSString *newLocalVariable = [dappDelegate.makers description];

NSLog(@"newLocalVariable: %@", [dappDelegate.makers description]);
// This is for verifying you have it loaded. 'description' is defined in the Maker NSObject, see below for those files, and above for where it was assigned originally

..... وقم بتعيينه إلى ما تريده الآن!

آمل أن يساعد هذا الجميع. يمكنك في هذه المرحلة إسقاط NSArray من هناك إلى nsdictionary ، ولكن الوصول الآن مع مفاتيح وقيم ، لذلك أكثر تعقيدًا في هذه المرحلة للوصول ، ولكن بالطبع مزايا. لا يمكنني الحصول على هذا الأمر تمامًا بعد ، وقد تراجعت عن هذه الطريقة لاستخدام nsarray في الوقت الحالي.

فيما يلي عينة من ملف صانعي H و M لكي ترونها أيضًا.

Maker.h

@interface Maker : NSObject 
{
    NSString *name;
    NSString *address;
    NSString *city;
    NSString *postalcode;
    NSString *country;
    NSString *phonenumber;
    NSString *email;
    NSString *description;
    NSString *services;
    NSString *website;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *postalcode;
@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *phonenumber;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSString *services;
@property (nonatomic, copy) NSString *website;

- (id)initWithName:(NSString *)n address:(NSString *)a city:(NSString *)c postalcode:(NSString *)z country:(NSString *)o phonenumber:(NSString *)p email:(NSString *)e description:(NSString *)d services:(NSString *)s website:(NSString *)w;

@end

وملف صانعها ؛

#import "ViolinMaker.h"

@implementation Maker
@synthesize name, address, city, postalcode, country, phonenumber, email, description, services, website;

- (id)initWithName:(NSString *)n address:(NSString *)a city:(NSString *)c postalcode:(NSString *)z country:(NSString *)o phonenumber:(NSString *)p email:(NSString *)e description:(NSString *)d services:(NSString *)s website:(NSString *)w; 
{
    self.name = n;
    self.address = a;
    self.city = c;
    self.postalcode = z;
    self.country = o;
    self.phonenumber = p;
    self.email = e;
    self.description = d;
    self.services = s;
    self.website = w;
    return self;
}
@end

آمل أن يساعد هذا الآخرين على الحصول على هذا بشكل مستقيم ، حيث كلفني ذلك كثيرًا من الوقت وآمل أن تتمكن من الحصول على القليل مما تعلمته.

بإخلاص ، كيرك

هل كانت مفيدة؟

المحلول

لا أرى أي نقطة تملأ فيها selectedMaker إيفار في DetailsViewController مع البيانات من "صانع المختار" من مندوب التطبيق. فقط لأن لديهم نفس الاسم لا يعني أنهم يشاركون نفس البيانات.

تحتاج إلى تعيين أو نسخ القيم من مندوب التطبيق إلى وحدة التحكم في العرض. الطريقة السريعة والقذرة هي القيام بشيء مثل:

@implementation DetailsViewController

...

-(void) viewDidLoad{
//selectedMaker=[[UIApplication sharedApplication] selectedMaker]; <-- this is wrong
//Edit, this is the correct call to app delegate
selectedMaker=[[[UIApplication sharedApplication] delegate] selectedMaker]; 
}

EDIT01:

لذلك ... بناءً على اقتراح Techzen ، حاولت نقل nsdictionary من RootViewController الخاص بي.

(1) لست متأكدًا لماذا لديك SelectedMaker فئة من ما يفترض أن ينجزه. يبدو أنك خلطت الفصل مع أ NSMutableDictionary. ليس لدى الفصل أي سبب واضح لإرجاع قاموس يحتوي على قيم Ivars الخاصة به. هذا زائد تماما. يبدو أن لديك بالفعل فصل يسمى ViolinMaker الذي يلف جميع البيانات لكل سجل صانع الكمان.

(2) طرق التهيئة ل SelectedMaker لا يتم تنفيذها بشكل صحيح. يبدو أن عليك الاتصال -[SelectedMaker initWithsName:..] قبل الاتصال -[SelectedMaker init] وإلا فإن init ليس لديه أدنى فكرة عن المفاتيح.

(3) في أي حال ، في didSelectRow الطريقة ، لا تقوم بتهيئة مثيل بالفعل SelectedMaker. هذا الخط:

SelectedMaker *selectedMaker = [[[NSMutableDictionary alloc]retain] initWithObjects: objects forKeys: keys];

لا ينشئ مثيل SelectedMaker ولكن بالأحرى أ NSMutableDictionary وأكثر أو أقل يلقيها على SelectedMaker صف دراسي. هذا هو السبب في أنك تحصل على تحذير المترجم من الحلقة.

(4) لا أرى أي حاجة ل SelectedMaker الفصل على الإطلاق. هذه الخطوط:

ViolinMakerAppDelegate *appDelegate = (ViolinMakerAppDelegate *)[[UIApplication sharedApplication] delegate];
ViolinMaker *violinMaker = (ViolinMaker *)[appDelegate.violinMakers objectAtIndex:indexPath.row];
violinMaker = [self.filteredViolinMakers objectAtIndex:indexPath.row];

يبدو أنك توفر لك جميع المعلومات التي تحتاجها لتوزيع أي صف معين في الجدول الخاص بك أو عرض التفاصيل الخاص بك. يمكنك استخدام هذه السطر الثلاثة في أي طريقة عرض تحتاج إلى الوصول إليها في البيانات appDelegate.violinMakers'. Theيحتوي Violinmaker`Object على جميع البيانات التي تحتاجها.

أعتقد أنك تجعل هذا أكثر تعقيدًا مما يجب أن يكون. كل ما تحتاجه هو (أ) فئة تغلف البيانات لكل سجل تم جلبه من SQL. في هذه الحالة ، يبدو أن صانع الكمان يفعل هذا. (ب) تحتاج إلى صفيف (أو مجموعة أخرى) في مندوب التطبيق لتخزين مثيلات صانع الكمان المتعددة. (ج) تحتاج إلى رمز في كل ViewController الذي سيصل إلى الصفيف/المجموعة في مندوب التطبيق بحيث يمكن لـ ViewController اختيار مثيلات صانع الكمان التي يحتاجها.

EDIT02:

لا ، لا يمكنني استخدام هذه الأسطر الثلاثة ، لأن "OffectAtIndex: IndexPath.Row" متوفر فقط داخل وظيفة DeSelectRow. مما يعني أنني سأضطر إلى إعادة بناء الجدول وجميع بياناته.

يمكنك فقط تحديد القاموس مرة واحدة كمتغير مثيل في مندوب التطبيق الخاص بك. لذلك ، سيكون لديك قاموس قابل للتغيير حيث كانت كل قيمة ViolinMaker وكان كل مفتاح بعض سمة صانع الكمان مثل الاسم. دعنا نسمي ذلك violinMakersDict.

لإلغاء طاولة ، ستحتاج إلى استخراج بعض القيم كصفيف. على الأرجح ، ستأخذ المفاتيح التي هي أسماء صانعي الكمان. بعد ذلك ، يمكنك فرز المصفوفة أبجديًا ، ثم يمكنك ملء كل صف مع القيمة في الصفيف في قيمة الفهرس.

وبالمثل ، إذا كنت بحاجة إلى إضافة بيانات في عرض واحد ، يمكنك الكتابة إلى violinMakersDict ثم الوصول إلى هذه البيانات من طريقة عرض أخرى عن طريق الاتصال مرة أخرى بمندوب التطبيق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top