gpt4 book ai didi

ios - NSPlaceholderDictionary : attempt to insert nil object from objects[1]

转载 作者:可可西里 更新时间:2023-11-01 03:43:25 25 4
gpt4 key购买 nike

我有两个 UITextField 框,一个用于 minPrice,一个用于 maxPrice。当我尝试运行由 submitButton IBAction 触发的函数时,使用这两个文本字段内容作为参数,它指出对象为空并出现以下错误:

'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: 尝试从对象 [1] 中插入 nil 对象'

我似乎不明白为什么输入到这些字段中的文本没有正确保存。当我以编程方式初始化它们时,我是否忘记了什么?

CriteriaViewController.h:

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import "SearchViewController.h"

@interface CriteriaViewController : UIViewController{

IBOutlet UISegmentedControl *Segment;
}


//@property (nonatomic) IBOutlet UITextField *itemSearch;
@property (weak, nonatomic) IBOutlet UITextField *minPrice;
@property (weak, nonatomic) IBOutlet UITextField *maxPrice;
@property (nonatomic, copy) NSNumber *chosenCategory;
@property (nonatomic, copy) NSString *chosenCategoryName;
@property (weak, nonatomic) NSString *itemCondition;
@property (weak, nonatomic) NSString *itemLocation;
@property (weak, nonatomic) NSString *itemSearch;

@end

CriteriaViewController.m:

#import "CriteriaViewController.h"

@interface CriteriaViewController ()
@property (weak, nonatomic) IBOutlet UISegmentedControl *itemConditionSegment;
@property (weak, nonatomic) IBOutlet UISegmentedControl *itemLocationSegment;


@end

@implementation CriteriaViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{

[super viewDidLoad];

[self addMinTextField];
[self addMaxTextField];


// Condition UISegment
UISegmentedControl *conditionSegmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Only New", @"Any", nil]];
conditionSegmentedControl.frame = CGRectMake(87, 190, 157, 30);
conditionSegmentedControl.selectedSegmentIndex = 0;
conditionSegmentedControl.tintColor = [UIColor blackColor];
[conditionSegmentedControl addTarget:self action:@selector(ConditionSegmentControlAction:) forControlEvents: UIControlEventValueChanged];
[self.view addSubview:conditionSegmentedControl];


// Location UISegment
UISegmentedControl *locationSegmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Fast Shipping", @"Large Selection", nil]];
locationSegmentedControl.frame = CGRectMake(67, 275, 200, 30);
locationSegmentedControl.selectedSegmentIndex = 0;
locationSegmentedControl.tintColor = [UIColor blackColor];
[locationSegmentedControl addTarget:self action:@selector(LocationSegmentControlAction:) forControlEvents: UIControlEventValueChanged];
[self.view addSubview:locationSegmentedControl];




// Submit button
UIButton *submitButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // Create Round Rect Type button.
submitButton.frame = CGRectMake(100, 100, 100, 100); // define position and width and height for the button.
[submitButton setTitle:@"Submit" forState:UIControlStateNormal];

[submitButton addTarget:self action:@selector(submitButton:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:submitButton];



}



-(void)addMinTextField{
// This allocates a label
UILabel *prefixLabel = [[UILabel alloc]initWithFrame:CGRectZero];
// This sets the font for the label
[prefixLabel setFont:[UIFont boldSystemFontOfSize:14]];
// This fits the frame to size of the text
[prefixLabel sizeToFit];

// This allocates the textfield and sets its frame
UITextField *minPrice = [[UITextField alloc] initWithFrame:
CGRectMake(70, 105, 75, 30)];

// This sets the border style of the text field
minPrice.borderStyle = UITextBorderStyleRoundedRect;
minPrice.contentVerticalAlignment =
UIControlContentVerticalAlignmentCenter;
[minPrice setFont:[UIFont boldSystemFontOfSize:12]];

//Placeholder text
minPrice.placeholder = @"150";

//Prefix label is set as left view and the text starts after that
minPrice.leftView = prefixLabel;

//It set when the left prefixLabel to be displayed
minPrice.leftViewMode = UITextFieldViewModeAlways;

// Adds the textField to the view.
[self.view addSubview:minPrice];

// sets the delegate to the current class
minPrice.delegate = self;
}

-(void)addMaxTextField{
// This allocates a label
UILabel *prefixLabel = [[UILabel alloc]initWithFrame:CGRectZero];
// This sets the font for the label
[prefixLabel setFont:[UIFont boldSystemFontOfSize:14]];
// This fits the frame to size of the text
[prefixLabel sizeToFit];

UITextField *maxPrice = [[UITextField alloc] initWithFrame:
CGRectMake(185, 105, 75, 30)];

//for max price
maxPrice.borderStyle = UITextBorderStyleRoundedRect;
maxPrice.contentVerticalAlignment =
UIControlContentVerticalAlignmentCenter;
[maxPrice setFont:[UIFont boldSystemFontOfSize:12]];

//Placeholder text is displayed when no text is typed
maxPrice.placeholder = @"300";

//Prefix label is set as left view and the text starts after that
maxPrice.leftView = prefixLabel;

//It set when the left prefixLabel to be displayed
maxPrice.leftViewMode = UITextFieldViewModeAlways;

// Adds the textField to the view.
[self.view addSubview:maxPrice];

// sets the delegate to the current class
maxPrice.delegate = self;
}



- (void)ConditionSegmentControlAction:(UISegmentedControl *)segment
{
if(segment.selectedSegmentIndex == 0)
{
// set condition to new
self.itemCondition = @"new";
}
else if (segment.selectedSegmentIndex == 1)
{
// set condition to all
self.itemCondition = @"all";
}
}

- (void)LocationSegmentControlAction:(UISegmentedControl *)segment
{
if(segment.selectedSegmentIndex == 0)
{
// set location to us
self.itemLocation = @"US";
}
else if (segment.selectedSegmentIndex == 1)
{
// set clocation to worldwide
self.itemLocation = @"Worldwide";
}
}


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






//add all the info to users respective new category object
- (IBAction)submitButton:(id)sender
{
//if (self.minPriceField.text.length > 0 && self.maxPrice.text.length > 0) {

[PFCloud callFunctionInBackground:@"userCategorySave"
withParameters:@{@"categoryId": self.chosenCategory,
@"minPrice": self.minPrice,
@"maxPrice": self.maxPrice,
@"itemCondition": self.itemCondition,
@"itemLocation": self.itemLocation,
@"categoryName": self.chosenCategoryName,
}
block:^(NSString *result, NSError *error) {

if (!error) {
NSLog(@"Criteria successfully saved.");

[self performSegueWithIdentifier:@"SearchCategoryChooserToMatchCenterSegue" sender:self];

}
}];

//}

}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {



// [PFCloud callFunctionInBackground:@"addToMatchCenter"
// withParameters:@{
// @"searchTerm": self.itemSearch,
// @"categoryId": self.chosenCategory,
// @"minPrice": self.minPrice,
// @"maxPrice": self.maxPrice,
// @"itemCondition": self.itemCondition,
// @"itemLocation": self.itemLocation,
// }
// block:^(NSString *result, NSError *error) {
//
// if (!error) {
// NSLog(@"'%@'", result);
// }
// }];

// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.

}

@end

最佳答案

您正在使用带有一个或多个nil 值的简写@{ key, value} 创建一个NSDictionary

作为开发阶段的预防技术,我建议您使用以下方法检查您所有的value(s):

NSParameterAssert(self.itemSearch);
NSParameterAssert(self.chosenCategory);
// etc.

这将抛出一个断言并让您知道您的 NSDictionary 构造注定会失败。

现在找出原因(在您的代码中)...如评论中所述,您在本地使用局部变量覆盖了类成员的范围:

// This allocates the textfield and sets its frame
UITextField *minPrice = ...

考虑使用这种构造(如果不是,当然,使用 IB 创建 UI 对象,您似乎正在这样做)

self.minPrice = ({
UITextField *minPrice = [[UITextField alloc] init...];
// more initialization of minPrice...

minPrice;
});
[self.view addSubview:self.minPrice];

关于ios - NSPlaceholderDictionary : attempt to insert nil object from objects[1],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24601377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com