属性实现错误

时间:2014-12-10 09:06:38

标签: ios objective-c iphone

我遵循本教程:

http://www.raywenderlich.com/1845/ios-tutorial-how-to-create-a-simple-iphone-app-tutorial-part-2

我收到以下错误:

1.Property implementation must have its declaration in interface "RWTDetailViewController"
2.Property "data" not found on object of type "id"

这是我的代码:

#import "RWTScaryBugDoc.h"
#import "RWTScaryBugData.h"
#import "RWTUIImageExtras.h"
#import "RWTDetailViewController.h"

@interface RWTDetailViewController ()
- (void)configureView;
@end

@implementation RWTDetailViewController

#pragma mark - Managing the detail item
@synthesize picker = _picker;



- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }
}

- (void)configureView
{
    // Update the user interface for the detail item.
    self.rateView.notSelectedImage = [UIImage imageNamed:@"shockedface2_empty.png"];
    self.rateView.halfSelectedImage = [UIImage imageNamed:@"shockedface2_half.png"];
    self.rateView.fullSelectedImage = [UIImage imageNamed:@"shockedface2_full.png"];
    self.rateView.editable = YES;
    self.rateView.maxRating = 5;
    self.rateView.delegate = self;

    if (self.detailItem) {
        self.titleField.text = self.detailItem.data.title;
        self.rateView.rating = self.detailItem.data.rating;
        self.imageView.image = self.detailItem.fullImage;
    }
}

- (IBAction)titleFieldTextChanged:(id)sender
{
    self.detailItem.data.title = self.titleField.text;
}

#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

#pragma mark RWTRateViewDelegate

- (void)rateView:(RWTRateView *)rateView ratingDidChange:(float)rating
{
    self.detailItem.data.rating = rating;
}

- (IBAction)addPictureTapped:(id)sender {
    if (self.picker == nil) {
        self.picker = [[UIImagePickerController alloc] init];
        self.picker.delegate = self;
        self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        self.picker.allowsEditing = NO;
    }
    [self presentViewController:_picker animated:YES completion:nil];
}

#pragma mark UIImagePickerControllerDelegate

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    [self dismissViewControllerAnimated:YES completion:nil];

    UIImage *fullImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];
    UIImage *thumbImage = [fullImage imageByScalingAndCroppingForSize:CGSizeMake(44, 44)];
    self.detailItem.fullImage = fullImage;
    self.detailItem.thumbImage = thumbImage;
    self.imageView.image = fullImage;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];
}

- (BOOL)shouldAutorotateToInterfaceOrientation
{
    return YES;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

当我将@synthesize移动到interface-declaration中时,我出现以下错误:" Illegal interface qualifier"

任何人都可以帮助我吗?

这是我的.h文件:

#import <UIKit/UIKit.h>
#import "RWTRateView.h"
@interface RWTDetailViewController : UIViewController <UITextFieldDelegate, RWTRateViewDelegate, UIImagePickerControllerDelegate, UINavigationBarDelegate>

@property (strong, nonatomic) id detailItem;

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (weak, nonatomic) IBOutlet RWTRateView *rateView;

@property (weak, nonatomic) IBOutlet UITextField *titleField;

@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;

@property (strong, nonatomic) UIImagePickerController *picker;

- (IBAction)addPictureTapped:(id)sender;

- (IBAction)titleFieldTextChanged:(id)sender;

@end

3 个答案:

答案 0 :(得分:0)

错误描述是自解释的,您需要在移动到实现(.m)文件并合成它之前,将选取器声明为接口(.h)文件中的属性。但是,您不再需要合成属性,但如果您这样做也很好 还有一件事,你错过了编程已经在.h文件中声明了这个属性的教程中的部分。您可以再看一下或将此行添加到 RWTDetailViewController.h

  

@property(强,非原子)UIImagePickerController *选择器;

修改
对于第二个错误,您将 detailItem 声明为 id 类型的对象,但是编写者正在使用自定义类 RWTScaryBugDoc ,他应该在其中使用名为 data 的属性。这就是因为属性 data 不属于 id 类型而导致错误的原因。您可能希望在教程结束时下载示例代码并交叉检查缺失点。

答案 1 :(得分:0)

您只需要先声明您的财产。因此,在界面(h文件或m文件的顶部)中,添加:

@property (nonatomic, strong)UIImagePickerController *picker;

@synthetise需要留在实施中。

答案 2 :(得分:0)

您将self.detailItem声明为Id。 Id不是类,因此它没有属性,但是您尝试访问self.detailItem.data ....这是不可能的。 我无法帮你解决这个问题,因为你的代码中存在很多逻辑错误,其中99%对我来说没有任何意义。