在我今天的应用程序中,我的图标不仅有一种颜色,而且在某些情况下有两种颜色,具体取决于我的应用程序中的数据状态.这意味着我无法使用默认的着色行为NavigationView.
它看起来像新的NavigationView,除非我ColorStateList为列表中使用的我的图标指定了一个默认值ColorStateList,我将使用colorPrimary我的主题中定义的我的等号.
我没办法强迫NavigationView停止着色我的图标吗?
android material-design android-design-library android-navigationview
我在如何使用moya和rxswift刷新oauth令牌时找到了这个例子,我必须稍微修改才能编译.这段代码适用于我的场景80%.它的问题是它将运行所有http错误,而不仅仅是401错误.我想要的是将我的所有其他http错误传递为错误,以便我可以处理其他地方而不是在这里吞下它们.
使用此代码,如果我得到一个HttpStatus 500,它将运行3次验证码,这显然不是我想要的.
我试图改变这个代码来处理只处理401错误,但似乎无论我做什么我都无法得到编译的代码.它总是抱怨错误的返回类型,"Cannot convert return expression of type Observable<Response> to return type Observable<Response>"这对我来说没有意义..
我想要的:处理401,但停止所有其他错误
import RxSwift
import KeychainAccess
import Moya
public extension ObservableType where E == Response {
/// Tries to refresh auth token on 401 errors and retry the request.
/// If the refresh fails, the signal errors.
public func retryWithAuthIfNeeded() -> Observable<E> {
return self.retryWhen {
(e: Observable<ErrorType>) in
return Observable.zip(e, Observable.range(start: 1, count: 3), resultSelector: { $1 }) …Run Code Online (Sandbox Code Playgroud) 我目前有一个项目有3个不同版本的同一个应用程序(不同的品牌等),这工作得很好.从那时起我就添加了3个新Apple Watch目标(每个应用程序"版本"1个),其中2个引用"主"Apple Watch目标中的文件.
一切正常,只要我记得更改每个故事板视图的模块引用,以便它映射到相应的watchkit扩展目标中的正确接口控制器.
但是,记住每次我需要运行/构建应用程序版本/目标时切换它是一个痛苦,而不是一个真正的长期解决方案.
我创建了以下命令,我想在正确的时间运行它,以便在编译之前更改storyboard引用.
perl -pi.bak -e 's/customModule=\"(.*?)\">/customModule=\"watchMyTarget_Extension\">/g' ${SRCROOT}/watch/Base.lproj/Interface.storyboard
Run Code Online (Sandbox Code Playgroud)
我还得出结论,我可能希望在应用程序编译后重置更改,因为我不想让git抱怨文件更改.这就是上述脚本创建.bak文件的原因.所以在完成编译并在设备上打包/运行之后,我想运行
mv ${SRCROOT}/watch/Base.lproj/Interface.storyboard.bak ${SRCROOT}/watch/Base.lproj/Interface.storyboard
Run Code Online (Sandbox Code Playgroud)
我已经尝试将脚本放在目标(watchTarget,而不是appTarget)构建方案中,Build->Pre/Post Actions这似乎没有任何效果.我尝试将它放在Run->Pre/Post Actions一定程度上工作,但似乎在将应用程序推送到模拟器之前启动了帖子操作,从而导致应用程序崩溃("无法运行查看设备日志"或类似的东西).
那么我到底需要将这些脚本放在构建过程中的正确时间运行?
我的项目有多个构建目标,因此我可以促进共享相同代码的"品牌"构建,但每个目标具有唯一的捆绑标识符和资产.我为我的一个应用目标创建了一个手表应用程序,它运行得很好.现在我正在尝试为我的其他目标使用相同的手表应用程序和扩展程序.我以为我可以轻松复制监视目标(监视和扩展),只需更改所有的bundle id引用以匹配其他目标,但它似乎是隐藏的引用.
我只是想为我所有不同的品牌目标使用一个手表应用程序.
旁注:手表应用程序也需要正确标记(资产文件夹).
有任何想法吗?谢谢.
解决方案更新
所以,我解决了它.当我复制我的监视目标(监视和扩展),并更改了捆绑ID,目标依赖关系,一切都使它与旧目标相同(但当然指向新目标),由于某种原因,新的监视目标没有' t指向正确的手表扩展目标.在任何地方都无法改变它.我试图重新复制目标,仍然有同样的问题.
所以我做的是打开project.pbxproj文件,搜索我的watch扩展(和bundle id)的任何引用并手动更新连接.我的手表目标依赖于错误的手表扩展,而新的手表扩展程序以某种方式指向旧手表扩展.我后来还发现我必须将构建指向正确的产品引用(appex参考),因为这也是错误的.
所以新的手表目标,指向错误的手表扩展,以及正确的手表扩展指向错误的appex(输出文件).所有这些我不得不在项目文件中手动更改.这听起来极端而且很难,但是一旦你记下了不同的UUID,它实际上并不那么困难.
我希望这可以帮助那些可能偶然发现同样奇怪问题的人.
似乎我们使用的应用程序getPropertyType(..)在ios7下失败了.无论出于何种原因,getPropertyType(..)例如NSString属性NSString$'\x19\x03\x86\x13作为类型返回,而不仅仅是NSString,而不是返回NSNumber NSNumber\xf0\x90\xae\x04\xff\xff\xff\xff.当我稍后检查特定类型时,所有这些都会导致一些棘手的问题.我已经改变了这个(传统的?)代码isKindOfClass,但是让我感到困扰的是我不明白这里发生了什么.
有问题的代码:
#import <objc/runtime.h>
static const char *getPropertyType(objc_property_t property) {
const char *attributes = property_getAttributes(property);
char buffer[1 + strlen(attributes)];
strcpy(buffer, attributes);
char *state = buffer, *attribute;
while ((attribute = strsep(&state, ",")) != NULL) {
if (attribute[0] == 'T') {
return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
}
}
return "@";
}
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事,为什么结果不同?
我已经尝试使用Instruments来检测内存故障.我使用以下指南向我展示如何设置Xamarin-> Instruments,http: //docs.xamarin.com/guides/ios/deployment,_testing,_and_metrics/instruments_walkthrough/
但是,我看到Instruments在Xcode5中改变了一些,而不是真的很重要,但是一些按钮名称等已经改变了名称.无论如何,我的问题是,当运行仪器时,我在仪器的调用堆栈中选择一个条目时没有得到"单声道代码"(在上面的指南中的步骤14中提到).有时我只得到对应用程序中调用的汇编程序/十六进制(?)引用(可能是因为工具无法匹配dsym文件),并且大多数时候我只在调用堆栈中获取名称:"native_to_managed_trampoline_ _ ",它显示了一些obj-c混淆代码.
那么,我怎么能在仪器中分析我的应用程序,看到正确的调用堆栈,当我点击调用堆栈条目时,请参阅有问题的c#代码(就像在指南中一样)??
ios ×5
apple-watch ×2
watchkit ×2
alamofire ×1
android ×1
instruments ×1
moya ×1
objective-c ×1
rx-swift ×1
swift ×1
xamarin ×1
xamarin.ios ×1
xcode ×1