0

View ControllerでdoSomethingメソッドを呼び出しています。メソッドはスーパー クラスとサブ クラスで宣言されています (これらのクラスは 3 つのエンティティ用です - 1 は他の 2 の親です)。スーパークラスは SuperClass と呼ばれます (実際にはそうではありませんが、質問のために)。superClass というクラスのインスタンスを作成しました。

[superClass doSomething];

このメソッドは文字列を返します。返されるこの文字列は、ViewController で宣言された UITextField にユーザーが入力したテキストであると想定されています。これを機能させることはできません。すべてが VC に含まれていたときは問題なく動作していましたが、スーパークラスから値が返されない場合はサブクラスを参照するエンティティ クラスを使用する必要があります。属性は返される名前です。見出しテキスト (UITextField) に値を入力し、doSomething (メソッド) にその値を superClass.name に格納して返させる必要があります。その後、cell.displayText.text = superClass.name にその値が表示されます。すべてのヘルプは非常に高く評価されています! ありがとう!

SuperClass.m

#import "SuperClass.h"

@implementation SuperClass

@dynamic name;

-(NSString *)doSomething
{

    return self.name;
}

@end

SubClassA.m

#import "SubClassA.h"  //SubClassA.h imports SuperClass.h

@implementation SubClassA

@dynamic body;
@dynamic heading;


-(NSString *)doSomething
{
   [super doSomething];

   return self.name;
}

@end

ViewController.m

- (IBAction)donePressed:(id)sender {


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

    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    SuperClass *superClass = [NSEntityDescription
                        insertNewObjectForEntityForName:@"SuperClass"
                        inManagedObjectContext:context];


   superClass.name = headingText.text; //headingText is UITextField


   NSString *fromDoSomething = [superClass doSomething];

   // I'm missing something here!

  [superClass doSomething];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%s",__FUNCTION__);

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.textLabel.font = [UIFont systemFontOfSize:19.0];
    }

    NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
    SuperClass *superClass = (SuperClass *)object;
    superClass.name = superClass.doSomething;


    cell.textLabel.text = superClass.name;

    return cell;

}
4

2 に答える 2

1

これが機能する最終的なコードです。値 (属性「名前」) をパラメーターとして渡します。

- (IBAction)donePressed:(NSString*) name {

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

    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    SuperClass *superClass = [NSEntityDescription
                              insertNewObjectForEntityForName:@"SuperClass"
                              inManagedObjectContext:context];

    superClass.name = headingText.text;  //headingText is UITextField on ViewController

    [superClass doSomething]; //doSomething is method in entity class

    NSError *error;
    BOOL success = [self.managedObjectContext save:&error];
    if (!success)
    {
        NSLog(@"%@", [error localizedDescription]);
    }



    [self fetchResults];

    [self.tableView reloadData];


}
于 2012-05-22T06:26:54.683 に答える
0

私はあなたのインターフェースファイルを見ていないので、スーパークラスを継承したかどうかはわかりませんが、継承していてそのメソッドをオーバーライドしたい場合は、メソッドを同じ名前でオーバーライドします

[super doSomething]

[super doName]メソッド名がdoSomething.youの場合、どのように doName をオーバーライドしましたか?

[super doSomething];

メソッドをオーバーライドするとは、子クラスではなく同じ名前でスーパークラスのメソッドを呼び出すことを意味します。

于 2012-05-21T08:45:21.810 に答える