【问题标题】:No visible @interface for method declares the selector方法没有可见的@interface 声明选择器
【发布时间】:2015-03-23 11:06:33
【问题描述】:

我正在尝试编写一个应用程序,该应用程序从名为 Jan Kowalski 的联系人那里获取照片并显示在屏幕上。 我对 iOS 和 xCode 还很陌生,所以我的代码中有错误。

这是我的 .m 文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

//@synthesize labelNewImage;
@synthesize labelOldImage;
//@synthesize imageViewNew;
@synthesize imageViewOld;



- (void) changePositionOfView:(UIView *)paramView to:(CGFloat)paramY
{

    CGRect viewFrame = paramView.frame;
    viewFrame.origin.y = paramY;
    paramView.frame = viewFrame;
}


- (void) createLabelAndImageViewForOldImage
{
    self.labelOldImage = [[UILabel alloc] initWithFrame:CGRectZero];
    self.labelOldImage.text = @"Obraz";
    self.labelOldImage.font = [UIFont systemFontOfSize:16.0f];
    [self.labelOldImage sizeToFit];
    self.labelOldImage.center = self.view.center;
    [self.view addSubview:self.labelOldImage];
    [self changeYPositionOfView:[self.labelOldImage
                                 to:80.0f]];// error - no visible @interface for 'UILabel' that declares the selector to

 self.imageViewOld = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
 self.imageViewOld.center = self.view.center;
 self.imageViewOld.contentMode = UIViewContentModeScaleAspectFit;
 [self.view addSubview:self.imageViewOld];
    [self changeYPositionOfView:[self.imageViewOld to:105.0f]];

}


- (ABRecordRef)getPersonWithFirstName:(NSString *)paramFirstName
                             lastName:(NSString *)paramLastName
                         inAddressBook:(ABRecordRef)paramAddressBook
{
    ABRecordRef result = NULL;
    if (paramAddressBook == NULL) {
        NSLog(@"Ksiazka ma wartosc NULL");
        return NULL;

    }

    NSArray *allPeople = (__bridge_transfer NSArray *)
    ABAddressBookCopyArrayOfAllPeople(paramAddressBook);
    NSUInteger peopleCounter = 0;
    for (peopleCounter=0; peopleCounter < [allPeople count]; peopleCounter++) {
        ABRecordRef person = (__bridge ABRecordRef)
        [allPeople objectAtIndex:peopleCounter];
        NSString *firstName = (__bridge_transfer NSString *)
        ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSString *lastName = (__bridge_transfer NSString *)
        ABRecordCopyValue(person, kABPersonLastNameProperty);

        BOOL firstNameIsEqual = NO;
        BOOL lastNameIsEqual = NO;

        if ([firstName length] == 0 && [paramFirstName length] == 0)
        {
            firstNameIsEqual = YES;

        }
        else if ([firstName isEqualToString:paramFirstName])
        {
            firstNameIsEqual = YES;
        }

        if ([lastName length] == 0 && [paramLastName length] == 0)
        {
            lastNameIsEqual = YES;

        }
        else if ([lastName isEqualToString:paramLastName])
        {
            lastNameIsEqual = YES;
        }
        if (firstNameIsEqual && lastNameIsEqual) {
            return person;

        }
    }
        return result;
}



- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor   = [UIColor blackColor];
    [self createLabelAndImageViewForOldImage];
    ABAddressBookRef addressBook = ABAddressBookCreate();

    if (addressBook !=NULL) {
        ABRecordRef janKowalski = [self getPersonWithFirstName:@"Jan" lastName:@"Kowalski" inAddressBook:addressBook];

        if (janKowalski == NULL) {
            NSLog(@"Nie znaleziono kontaktu tworzenie nowego.");
            janKowalski = [self newPersonWithFirstName:@"Jan" // error - no visible @interface for 'ViewController' that declares the selector 'newPersonWithFirstName

                                              lastName:@"Kowalski"
                                         inAddressBook:addressBook];

        }

        if (janKowalski == NULL) {
            NSLog(@"Nie udało się utworzyć nowego rekordu dla tego kontaktu.");
            CFRelease(addressBook);
            return;

        }

    self.imageViewOld.image = [[self getPersonImage]:janKowalski]; // error - no visible @interface for 'ViewController' delcares the selector 'getPersonImage'
    }
}

还有我的 .h 文件:

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>



@interface ViewController : UIViewController

@property (strong, nonatomic) UILabel *labelOldImage;

@property (strong, nonatomic) UIImageView *imageViewOld;


@end

我收到这些“声明选择器的 'UILabel' 没有可见的@interface”错误。 你们能告诉我如何解决这个问题吗?

非常感谢!

【问题讨论】:

    标签: ios objective-c xcode


    【解决方案1】:

    这只是放置方括号的错误。您已经定义了一个带有两个参数的方法...

    changePositionOfView:(UIView *)paramView to:(CGFloat)paramY
    

    ...但你只用一个...

    [self changeYPositionOfView:[self.labelOldImage to:80.0f]];
    

    检查括号是否匹配。

    编译器认为您想调用[self.labelOldImage to:80.0f] 并将结果传递给名为justchangeYPositionOfView: 的单参数方法。

    通过修复嵌套将值传递给两个参数:

    [self changeYPositionOfView:self.labelOldImage to:80.0f];
    

    【讨论】:

    • 这是我的第一个想法,但它仍然显示错误:没有可见的 @interface for 'ViewController' 声明选择器 changeYPositionOfView:to:
    • 拼写。 changeYPositionOfViewchangePositionOfView。 (但答案的其余部分也适用。)
    • 非常感谢.. 你能帮我解决这两个问题吗? ' no visible @interface for 'ViewController' that declares the selector 'newPersonWithFirstName''no visible @interface for 'ViewController' delcares the selector 'getPersonImage'
    • 我没有看到您发布的任何地方声明或实现了这些方法。是什么让您认为它们存在?
    【解决方案2】:

    问题:

    - changePositionOfView:(UIView *)paramView to:(CGFloat)paramY
    

    但是你发送这个:

    [self changeYPositionOfView:[self.labelOldImage
                                     to:80.0f]];// error - no visible @interface for 'UILabel' that declares the selector to
    

    使用 2 个参数来实现。

    是的,当您使用@synthesize 时,在调用标签/图像之后使用labelOldImager,而不是self.labelOldImage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2021-09-22
      相关资源
      最近更新 更多