[__NSArrayI 长度]:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】[__NSArrayI 长度]:发送到实例的无法识别的选择器【英文标题】:[__NSArrayI length]: unrecognized selector sent to instance 【发布时间】:2014-02-18 20:21:14 【问题描述】:

我正在尝试将数据从 Collection View Controller 传递到 Table View Controller,但是当我认为一切正常时,就会出现这个问题。无法识别的选择器发送到实例我的代码是这样的:

ViewController.m(集合视图控制器)

#import "ViewController.h"
#import "ColViewCell.h"
#import "DetailViewController.h"

@interface ViewController ()

// Private member varibles
NSArray *_arrayOfImages;
NSArray *_arrayOfNames;

// Array de ingredientes
NSArray *_arrayOfCeviche;
NSArray *_arrayOfTacacho;
NSArray *_arrayOfAnticucho;
NSArray *_arrayOfPapita;
NSArray *_arrayOfParihuela;
NSArray *_arrayOfLomo;

NSArray *_arrayOfIngredients;


- (void)viewDidLoad

 [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

// Array que contiene los titulos
_arrayOfNames = @[@"Anticucho", @"Arroz Chaufa", @"Cebiche", @"Pachamanca", @"Papa a la Huancaina", @"Parihuela", @"Picante de cuy", @"Tacacho con cecina", @"Pollo a la brasa", @"Lomo saltado"];

// Array que contiene las imagenes
_arrayOfImages = @[@"Anticucho.jpg", @"chaufa.jpg", @"ceviche.jpg", @"pachamanca.jpg", @"papita.jpg", @"parihuela.jpg", @"cuy.jpg", @"tacacho.jpg", @"brasa.jpg", @"lomo.jpg"];

// Arrays que de los ingredientes
_arrayOfCeviche = @[@"Quesito", @"Limon", @"Choclito", @"Cocinita", @"La lechesita", @"La miradita", @"La weuabdita", @"La cagada", @"Ptm Toy Jodido XD", @"Que emoción", @"Wiiiiiii"];

_arrayOfLomo = @[@"Que novedada", @"jajajaja que buena", @"Lukita", @"losisisisi", @"maniserio", @"joder", @"joselet", @"lskadlkdl", @"bah"];

_arrayOfPapita = @[@"que buena!", @"csm!!", @"que genio!", @"novedades", @"que rico!!", @"coger delicisioso", @"Mffffff"];

_arrayOfParihuela = @[@"Un culaso", @"Chambon", @"Noveades", @"que hacer", @"asu macho", @"Espero que este bien", @"Así es la vida la chamba", @"Debo aprender mas!!"];

_arrayOfTacacho = @[@"Tacachin", @"Lalilinnn", @"Masinisn", @"Joder", @"Ojojoojojo", @"Lista hermosa!"];

_arrayOfAnticucho = @[@"Me encanta Objective-c", @"Hermosisimo", @"Me encanta xcode!", @"Que hermoso es esto", @"Debe ser un chambon total", @"jajajaja novedades", @"Lol supremo"];


 ***NSArray that contains all the arrays***
_arrayOfIngredients = @[_arrayOfCeviche, _arrayOfLomo, arrayOfAnticucho, _arrayOfParihuela, _arrayOfTacacho, _arrayOfPapita];


以及我将数据从我的集合视图传递到表格视图的方法

  // Method to pass data from a view to another view
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

if ([segue.identifier isEqualToString:@"showDetail"]) 

    NSIndexPath *indexPath = [[self.collectionView indexPathsForSelectedItems] objectAtIndex:0];

    DetailViewController *dvc = [segue destinationViewController];
    dvc.Titulos = [_arrayOfIngredients objectAtIndex:indexPath.item];
  

我的 DetailViewController.h(表格视图控制器)

#import <UIKit/UIKit.h>

@interface DetailViewController : UITableViewController

@property (strong, nonatomic) NSString *Titulos;

@end

我的 DetailViewController.m(表格视图控制器)

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...

***Xcode tell me this line is the problem...***
cell.textLabel.text = self.Titulos;

return cell;

我的代码有什么问题??? U.u

【问题讨论】:

这意味着 NSArray 不识别“长度”方法。尝试“count”或从传递 NSArray 切换为传递 NSString。 NSArray has no length method. (提示:如果您花时间研究它,您忽略的所有异常 gorp 都非常有价值。它会告诉您,例如,发生异常的确切行,您所在的对象的类型处理(NSArray),以及被调用的方法(“length”))。 (如果您费心在问题中包含该异常信息,并找出错误所在的行,您会让这里的人们更快乐,并且不太愿意对您的问题投反对票。) 非常感谢您的建议 :) 我是 iOS 开发和 *** 的新手 :) 下次我会这样做 :)! 【参考方案1】:
dvc.Titulos = [_arrayOfIngredients objectAtIndex:indexPath.item];

如果_arrayOfIngredients 是一个包含多个 NSArray 对象的 NSArray,那么您将一个数组传递给 Titulos 对象。

Titulos 是一个 NSString,因此当 UILabel 尝试访问 NSString 上的 - length 属性时,会发生崩溃,因为 Titulos 是一个 NSArray 而不是 NSString。


在您的 DetailViewController 上,我假设您想从 _arrayOfIngredients 传递一个子数组。

#import <UIKit/UIKit.h>

@interface DetailViewController : UITableViewController

@property (strong, nonatomic) NSArray *Titulos;

@end

然后您必须像 ViewController 一样配置 DetailViewController,但使用 Titulos 数组。

【讨论】:

哦,我明白了,我应该寻找什么属性来解决我的问题?或者我应该寻找或做什么?【参考方案2】:

NSArray 不响应length,它响应count。在以下行中:

dvc.Titulos = [_arrayOfIngredients objectAtIndex:indexPath.item];

您将NSArray 传递给采用NSString 的属性,因此它有时会尝试获取字符串的长度,而是在NSArray 对象上调用length 方法,这没有响应,所以它崩溃了。

【讨论】:

哦,我明白了,我应该寻找什么属性来解决我的问题?或者我应该寻找或做什么? 这取决于你想用那个值做什么。您需要检查您的程序逻辑。就像现在一样,Titulos 设置为您在上面定义的那些数组之一。您实际上希望将 Titulos 设置为什么?这是你需要问自己的问题。【参考方案3】:

校验码:

for (int j=0; j<enumKeyReferenceArray.count; j++) 
  NSString *attri =[enumKeyReferenceArray valueForKey:@"BeltCondition"];      

一个问题是我忘记告诉编译器我需要哪个索引元素。

正确的行应该是:

NSString *attri =[enumKeyReferenceArray[j] valueForKey:@"BeltCondition"]; 

【讨论】:

【参考方案4】:

我有一个 NSArray *dataArray 来填充 tableView

是什么导致我的问题是我使用

self.dataArray = [NSArray arrayWithObject:anotherArray];

我应该做的是

self.dataArray = [NSArray arrayWithArray:anotherArray]

因此,在您的情况下,您应该检查 dataArray 中包含的内容

【讨论】:

【参考方案5】:

就我而言,问题是通过 API 传来的数据 数据是:


    "status": true,
    "message": "Order listed successfully.",
    "data": [
        
            "order_id": "9",
            "restaurant_name": "Demo Restaurant",
            "payment_token": "Test162R25892",
            "payment_status": "Approved",
            "subtotal": "480.00",
            "final_amount": "561.00",
            "vat": "57.00",
            "service_fee": "24.00",
            "delivery_fee": "0.00",
            "discount": "0.00",
            "customer_type": "member",
            "created": "2016-02-28 12:17:21",
            "order_status": "complete"
        
    ]

通过 NSJSONSerialization 将其转换为 NSDictionary 后


    data =     (
                
            created = "2016-02-28 12:17:21";
            "customer_type" = member;
            "delivery_fee" = "0.00";
            discount = "0.00";
            "final_amount" = "561.00";
            "order_id" = 9;
            "order_status" = complete;
            "payment_status" = Approved;
            "payment_token" = Test162R25892;
            "restaurant_name" = "Demo Restaurant";
            "service_fee" = "24.00";
            subtotal = "480.00";
            vat = "57.00";
        
    );
    message = "Order listed successfully.";
    status = 1;

我只是错过了 JSON 和 ( 在 Dict 中的 [ 括号,在数据内部并像

一样解析它

lblDate.text = [[dict valueForKey:@"data"] valueForKey:@"created"]

并且发生异常是因为我尝试将数组值发送到标签文本。请仔细查看您正在处理的数据。

【讨论】:

【参考方案6】:

就我而言,这是其中一个 pod 的问题。已用pod update 修复。

【讨论】:

以上是关于[__NSArrayI 长度]:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

-[__NSArrayI 长度]:无法识别的选择器发送到实例 0x7f1e9f90

-[__NSArrayI replaceObjectAtIndex:withObject:]: 无法识别的选择器发送到实例

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

Cordova iOS 3.6.3+ 问题 - [__NSArrayI 长度]:无法识别的选择器

[__NSDate 长度]:发送到实例的无法识别的选择器