所以,我正在将应用程序从日语本地化为英语.
在日语中,(例如)"先生"之间没有区别 和"女士"(/"太太"),所以我需要做这样的事情:
/* Salutation format for user (male) */
"%@?" = "Mr. %@";
/* Salutation format for user (female) */
"%@?" = "Ms. %@";
Run Code Online (Sandbox Code Playgroud)
如您所见,日语本地化在两种情况下都使用相同的字符串.我的印象是,当字符串文件包含多个具有相同"源"(即左侧)字符串的条目时,"注释"用于确定使用哪一个.事实证明我错了,评论参数只是对人工翻译的一种帮助,完全被忽略了NSLocalizedString().
因此,如果我运行应用程序,则无论用户的性别如何,下面的两个代码路径都会生成相同的字符串:
NSString* userName;
BOOL userIsMale;
/* userName and userIsMale are set... */
NSString* format;
if(userIsMale){
// MALE
format = NSLocalizedString(@"%@?",
@"Salutation format for user (male)");
}
else{
// FEMALE
format = NSLocalizedString(@"%@?",
@"Salutation format for user (female)");
}
NSString* salutation = [NSString stringWithFormat:format, userName];
Run Code Online (Sandbox Code Playgroud)
那么,我应该如何处理这样的案件呢?
我试图从快速代码中调用Security.framework中的函数.忘记"错误输出"(最后)参数一秒,如果我调用这样的函数:
let accessControlRef = SecAccessControlCreateFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
SecAccessControlCreateFlags.UserPresence,
nil
)
Run Code Online (Sandbox Code Playgroud)
我发现以下错误:
找不到类型为'SecAccessControlCreateFlags'的初始值设定项,它接受类型'(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)'的参数列表
...但是,如果我将代码重新格式化为以下内容:
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
nil
)
Run Code Online (Sandbox Code Playgroud)
(特定类型-eg,CFAllocatorRef- 取自Xcode自动完成时的函数原型)...它编译没有问题.这是怎么回事?
接下来是错误参数.我应该通过什么?迁移我的Objective-C代码,我很想传递以下变量(&当然是前缀):
var accessControlError:CFErrorRef! = nil
Run Code Online (Sandbox Code Playgroud)
...给出了错误:
无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)的参数列表调用'SecAccessControlCreateWithFlags'
相反,如果我传递了以下变量(再次使用address-of运算符):
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
Run Code Online (Sandbox Code Playgroud)
(与原型自动完成建议的类型相同),我得到:
无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout UnsafeMutablePointer?>)的参数列表调用'SecAccessControlCreateWithFlags'
......那么,是什么给出的?
编辑:忘记错误参数.我好像在拿地址两次(即指向指针的指针).相反,我应该这样做:
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = …Run Code Online (Sandbox Code Playgroud) 我正在搞乱一个xcode项目,当我触摸它时,我正试图让一个红色的球SKShapeNode四处移动.触摸我自己的源代码开始上课并没有做到.我的代码有什么缺陷,我需要做些什么来修复它.
import SpriteKit
class GameScene: SKScene {
//Rectangle Skeletions
var leftWallRect = CGRect(x: 0, y: 0, width: 40, height: 1000)
var ball = SKShapeNode(circleOfRadius: 25);
override func didMoveToView(view: SKView) {
// Declare the Sprites in your scene
var ball = SKShapeNode(circleOfRadius: 25);
let leftWall = SKShapeNode(rect: leftWallRect);
let rightWall = SKShapeNode(rect: leftWallRect);
let pin = SKSpriteNode(imageNamed: "pin");
// Ball Properties
ball.strokeColor = UIColor.blackColor()
ball.fillColor = UIColor.redColor()
ball.position = CGPointMake(self.frame.width / 2 , self.frame.height / 4 - 100 )
self.addChild(ball)
// …Run Code Online (Sandbox Code Playgroud) 我的类有一个NSURL从字符串初始化的类型属性.该字符串在编译时已知.
要使类正常运行,必须在初始化(不是更晚)时将其设置为其预期值,因此将它定义为可选(隐式展开或其他方式)没有意义:
class TestClass: NSObject {
private let myURL:NSURL
...
Run Code Online (Sandbox Code Playgroud)
假设NSURL(string:)(返回NSURL?)如果传递了编译时已知的有效URL字符串,则永远不会失败,我可以这样做:
override init() {
myURL = NSURL(string: "http://www.google.com")!
super.init()
}
Run Code Online (Sandbox Code Playgroud)
但是,我在某种程度上对强制解包感到不舒服,并希望以某种方式保护URL初始化.如果我试试这个:
guard myURL = NSURL(string: "http://www.google.com") else {
fatalError()
}
Run Code Online (Sandbox Code Playgroud)
可选类型'NSURL?'的值 没有打开; 你的意思是用'!' 要么 '?'?
(注意:没有办法在上面的代码中添加!或?修复错误的任何地方.条件解包只发生guard let... guard var...,并且myURL已经定义)
我明白为什么失败:即使成功调用NSURL(string:)的返回(有效的)NSURL 包裹内的可选NSURL?,所以我还需要以某种方式分配给前解开它myURL(这是不可选的,因此不转让兼容原样).
我可以通过使用中间变量解决这个问题:
guard let theURL = NSURL(string: "http://www.google.com") else …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。
这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。
我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。
我可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。
覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......
没有更好/更优雅的方式吗?
注:供参考,相关方法的执行顺序如下:
- AppDelegate.init()
- 视图控制器.init()
- AppDelegate.application(_:willFinishLaunchingWithOptions:)
- AppDelegate.application(_:didFinishLaunchingWithOptions:)
- ViewController.viewDidLoad()
清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我很清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。
我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
// INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE
// (NOT BEFORE):
MyViewController* controller = …Run Code Online (Sandbox Code Playgroud) 我注意到,如果我以编程方式实例化UITableViewCell实例,并指定样式.value1(UITableViewCellStyleValue1),则主文本标签文本颜色为黑色,而详细文本标签文本颜色为浅灰色阴影(虽然不是很准确UIColor.gray或UIColor.lightGray)。
但是,如果我将情节提要与原型,静态单元格一起使用,并将其Style属性设置为“ Right Detail”(似乎与Interface Builder等效.value1),则两个标签均为黑色。
我可以将单元格的子视图一直导航到标签,并在属性检查器中更改文本颜色,但是我不确定是否存在颜色预设。
有没有一种在两种情况下统一单元格外观的正确方法,同时又在细节文本标签中保留了传统的灰色?
(我将使用动态单元格并以编程方式实例化它们,但是这种单视图控制器恰好使这些现成的单元格与更复杂的自定义单元格并排。)
我正在尝试在 Swift 3 中采用UITextInputTraitsfor 自定义UIButton子类。
我添加了文档“符号”部分中指定的所有属性:
import UIKit
class TextInputButton: UIButton {
var autocapitalizationType: UITextAutocapitalizationType = .none
var autocorrectionType: UITextAutocorrectionType = .no
var spellCheckingType: UITextSpellCheckingType = .no
var enablesReturnKeyAutomatically: Bool = false
var keyboardAppearance: UIKeyboardAppearance = .default
var keyboardType: UIKeyboardType = .default
var returnKeyType: UIReturnKeyType = .default
var isSecureTextEntry: Bool = false
// (...rest of class implementation omitted...)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,isSecureTextEntry会导致以下错误:
由 setter 为“isSecureTextEntry”提供的 Objective-C 方法“setIsSecureTextEntry:”与需求的选择器(“setSecureTextEntry:”)不匹配
如果我使用建议的“修复”,则属性声明将变为:
var @objc(setSecureTextEntry:) isSecureTextEntry: Bool = false
Run Code Online (Sandbox Code Playgroud)
...但现在我得到了三个错误: …
我目前在 UITextField 上有以下扩展来计算给定字符串的边界矩形。
func widthHeight(font: UIFont) -> CGRect {
let constraintRect = CGSize(width: 200, height: 1000)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox
}
Run Code Online (Sandbox Code Playgroud)
的宽度constraintRect是我想要允许的盒子的最大宽度。
我像这样设置值和单元格:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuse, for: indexPath) as? ChatCollectionViewCell {
let text = self.chatLog[indexPath.row].text
cell.chatTextView.text = text
cell.chatViewWidth = (text?.widthHeight(font: UIFont.systemFont(ofSize: 16)).width)!
return cell
}
return UICollectionViewCell()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: …Run Code Online (Sandbox Code Playgroud) 我注意到,自iOS 11以来,目录中App的"App Icon"资产必须包含1024x1024大小的版本才能提交到App Store.
我知道之前已经将1024x1024图标直接添加到iTunesConnect应用页面,但我似乎无法获得任何链接或以完整大小显示该图标以从iTunesConnect页面获取它.
如何检索已发布的应用程序的现有1024x1024图标?我没有原始图标的PSD文件.
亲爱的开发者,
我们发现了您最近为[App]发送的一个或多个问题.您的投放成功,但您可能希望在下次投放时更正以下问题:
缺少营销图标 - iOS应用程序必须包含PNG格式的1024x1024px营销图标.不包含营销图标的应用无法提交给App Review或Beta App Review.
纠正问题后,您可以使用Xcode或Application Loader将新二进制文件上传到iTunes Connect.
问候,
App Store团队
我正在一个包含100多个源文件的项目中。我决定实现一个可重用的自定义视图,我可以在Interface Builder上预览其布局,如本问题和许多其他文章中所述。
但是,我无法让Interface Builder刷新(渲染)我的视图。
像往常一样,我将UIView对象库中的库存放入Interface Builder中的视图层次结构中,然后在Identity Inspector中将其类更改为我自己的类。字段“ Desginables”(在“从目标继承模块”下的右侧)显示为“最新”。
但是,自定义视图的内部布局无法预览。(它包含文本字段,标签和自定义背景色)。
从主菜单中选择“ 编辑器”>“刷新所有视图 ”会触发构建,并立即更改为“ Designables更新”,但是构建完成后,我的自定义视图仍为空白。
我尝试创建一个新的最小项目(通过Sinlge View Application项目模板),然后将我的.xib和自定义类源文件完整地移植了下来。放心,将其放置在xib或情节提要板中时,可以按预期进行预览。
我知道这可能是一个远景,但这是大型项目Xcode的已知问题吗?
还是我应该在现有项目中寻找其他可能干扰可设计元素呈现的其他设置?
ios ×7
swift ×5
app-store ×1
appdelegate ×1
cocoa ×1
ibdesignable ×1
ios11 ×1
localization ×1
objective-c ×1
optional ×1
sprite-kit ×1
touchesbegan ×1
touchesmoved ×1
uilabel ×1
uistoryboard ×1
uitableview ×1
xcode ×1
xcode9 ×1