我需要从中创建一个"名称",如下所示:
firsname 姓氏和其他名字 otherlastname (即 Barbara Smith 和 John Jameson(
但是,如果缺少任何部分,则需要将其与分隔空格和/或分隔"和"一起省略,以便最终成为"芭芭拉和约翰"或"约翰詹姆森"或"史密斯和詹姆森"或这四个字段的任何组合存在。
如果它是执行回调的这四个字段之一,我调用一个方法来从textFieldShouldEndEditing
创建这个新名称字符串。 然后,我使用自己的协议方法通过委托回调设置应用标题(由于我的视图控制器嵌套(。
这一切都很好用,除了由于某种原因,在这四个字段之间点击真的很慢。
在我的视图中的任何其他文本字段之间点击要快得多。 我怀疑这是我的名字字符串生成方法。
这是我textFieldShouldEndEding
回调:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
// set the event title if the client name fields have been edited
if ((textField == self.CPNameFirst) || (textField == self.CPNameLast) || (textField == self.CSNameFirst) || (textField == self.CSNameLast)) {
if (self.CPNameFirst.text.length == 0 && self.CPNameLast.text.length == 0 && self.CSNameFirst.text.length == 0 && self.CSNameLast.text.length == 0) {
// the user has just erased all data that could make up the event name automatically
self.theEvent.name = @"New Client";
} else {
// set the event name using the client names
self.theEvent.name = [self generateAutomaticEventName];
}
[self.delegate changeAppTitle:self.theEvent.name];
}
return YES;
}
以及生成名称字符串的方法:
- (NSString *)generateAutomaticEventName {
NSString *theName = [[NSString alloc] init];
NSString *CPPart = [[NSString alloc] init];
NSString *CSPart = [[NSString alloc] init];
// generate the primary client part
if ((self.CPNameFirst.text.length == 0) && !(self.CPNameLast.text.length == 0)) {
// primary first name is blank so we don't need the leading space
CPPart = self.CPNameLast.text;
} else if ((self.CPNameLast.text.length == 0) && !(self.CPNameFirst.text.length == 0)) {
// primary first name is blank so we don't need the trailing space
CPPart = self.CPNameFirst.text;
} else if ((self.CPNameFirst.text.length == 0) && (self.CPNameLast.text.length == 0)) {
// both are blank
CPPart = @"";
} else {
// neither are blank
CPPart = [NSString stringWithFormat:@"%@ %@", self.CPNameFirst.text, self.CPNameLast.text];
}
// generate the secondary client part
if ((self.CSNameFirst.text.length == 0) && !(self.CSNameLast.text.length == 0)) {
// secondary first name is blank so we don't need the leading space
CSPart = self.CSNameLast.text;
} else if ((self.CSNameLast.text.length == 0) && !(self.CSNameFirst.text.length == 0)) {
// secondary first name is blank so we don't need the trailing space
CSPart = self.CSNameFirst.text;
} else if ((self.CSNameFirst.text.length == 0) && (self.CSNameLast.text.length == 0)) {
// both are blank
CSPart = @"";
} else {
// neither are blank
CSPart = [NSString stringWithFormat:@"%@ %@", self.CSNameFirst.text, self.CSNameLast.text];
}
// combine the two parts into the final name
if ((CSPart.length == 0) && !(CPPart.length == 0)) {
// no secondary client names entered
theName = CPPart;
} else if ((CPPart.length == 0) && !(CSPart.length == 0)) {
// no primary client names entered
theName = CSPart;
} else if ((CPPart.length == 0) && (CSPart.length == 0)) {
// both are blank
theName = @"New Client";
} else {
theName = [NSString stringWithFormat:@"%@ and %@", CPPart, CSPart];
}
return theName;
}
有没有更好的方法可以做到这一点?
会不会是其他原因导致经济放缓? (设置应用标题不是委托回调...我已经测试过了。
评论者提到的,仪器是你的朋友。您可以通过在 Xcode 中的"产品"菜单下选择"配置文件"来运行您的应用程序。使用时间探查器模板。
一些明显的问题只是瞥了一眼你的代码:
- 不要分配/初始化 CPPart 和 CSPart。稍后将分配它们。(惯例说像这样的局部变量应该以小写开头。
- 计算每个文本字段的长度 3 次。只需执行一次并存储在局部变量中。
我的猜测和其他人一样只是猜测。使用仪器进行分析将准确告诉您时间花费在哪里。
你的代码看起来不错,但无论如何这是一个小小的优化。
NSArray *array = [NSArray arrayWithObjects:self.CPNameFirst.text, ... all your inputs..., nil];
NSMutableString *str = [[NSMutableString alloc] init];
for (NSString *s in array)
{
if (s.length>0)
{
if (str.length>0)
[str appendString:@" "];
[str appendString:s];
}
}
if (!str.length)
str = @"new client";
return str;
(可能存在一些语法错误,因为我没有对此进行测试。
我无法解决这个问题。 我清理了很多代码,当从textFieldShouldEndEditing
调用时,它的执行速度仍然非常慢。
我把呼叫放在textFieldShouldReturn
,然后keyboardWillBeHidden
,现在一切都快多了(尽管它仅在键盘关闭或点击 Return 时才执行(。
感谢大家的帮助!