我有一个具有明确用户交互的应用程序,它利用了用户的当前位置.如果用户拒绝访问位置服务,我仍然希望后续用户提示用户转到设置并为我的应用重新启用位置服务.
我想要的行为是内置地图应用程序的行为:
在我自己的应用程序中,相同的基本流程导致我的CLLocationManagerDelegate -locationManager:didFailWithError:方法在最后一步调用kCLErrorDenied错误,并且用户没有选择打开Settings应用程序来纠正它.
我可以显示自己的警报以响应错误,但是它无法启动"设置"应用程序,就像操作系统可以提供内置地图应用程序所使用的警报一样.
CLLocationManager类中有什么东西我错过了能够给我这个行为吗?
我有一个动作过滤器,负责将一些常见信息放入ViewBag,供共享_Layout.cshtml文件中的所有视图使用.
public class ProductInfoFilterAttribute : ActionFilterAttribute
{
public override void
OnActionExecuting(ActionExecutingContext filterContext)
{
// build product info
// ... (code omitted)
dynamic viewBag = filterContext.Controller.ViewBag;
viewBag.ProductInfo = info;
}
}
Run Code Online (Sandbox Code Playgroud)
在共享的_Layout.cshtml文件中,我使用已放入ViewBag的信息.
...
@ViewBag.ProductInfo.Name
...
Run Code Online (Sandbox Code Playgroud)
如果处理控制器动作时发生异常,标准HandleErrorAttribute应显示我的共享Error.cshtml视图,并且这个工作之前予介绍上面的动作过滤器,并使用在_Layout.cshtml从ViewBag新的值开始.现在我得到的是标准的ASP.Net运行时错误页面,而不是我的自定义Error.cshtml视图.
我已经跟踪下来的事实,在渲染的错误观点,一个RuntimeBinderException("不能执行运行时的空引用结合")被抛出在_Layout.cshtml使用ViewBag.ProductInfo.Name的.
即使我的动作过滤器在抛出原始异常之前已在ViewBag中成功设置了值,但在渲染我的Error.cshtml视图时,仍会使用带有空ViewBag的新上下文.
有没有办法让动作过滤器创建的数据可用于自定义错误视图?
在UITableView
细胞包含UITextField
物体的地方,是否有一个UITextField
物体是第一个响应者阻止其细胞被重复使用?
例如,UITableView
如果行的行数超过屏幕上的行数,则可以点击a UITextField
来调出该单元格中字段的键盘.然后滚动表格视图以使该单元格离开屏幕.当滚动回到单元格时,我可以看到-tableView:cellForRowAtIndexPath:
所有单元格的调用,但包含UITextField
当前具有第一响应者状态的单元格除外.
这种行为让我相信iOS知道我的单元格包含第一个响应者,因此选择不丢弃单元格,因此当它滚动回视图时不需要调用数据源来获取单元格.
这种行为是可取的,但我担心,因为我没有看到任何表明这种行为得到保证的文档,如果有条件不成立,我不愿意依赖它.
有人能指出一些关于表视图单元重用的文档以及覆盖这种情况的第一响应者吗?
注意:这适用于在C++,C++/CLI和C#中工作的商店,其中一些产品是作为三者的组合交付的.
我们目前有一条规则,即项目应该只有一个包含解决方案.该规则最初是因为Visual Studio的源代码控制插件无法处理多个解决方案中包含的项目,因此在从一个解决方案更改为另一个解决方案时总是尝试更改源代码控制绑定.
出于其他原因,我们将完全停止使用源代码控制插件(不会丢弃源代码控制,只是停止使用脑干插件).它重新提出了是否继续限制只包含一个解决方案的项目的政策的问题.
我们在多个可交付产品所使用的库,dll和程序集中有相当多的代码,我们目前通过一个解决方案间依赖关系管理系统来控制它,如果一个人在最终产品的解决方案中工作,请求构建依赖项解决方案是一件简单的事情,它将启动Visual Studio的其他实例来构建它们.该系统有效,但有以下缺点:
我正在考虑修改政策,允许多个可交付产品中使用的项目包含在多个解决方案中.我们可以消除解决方案间依赖关系管理并严重减少解决方案的数量(每个产品减少一个).我担心这次重组将需要做多少工作以及是否值得付出努力.在团队使用它一段时间之前,我恐怕甚至无法发现潜在的好处.我还预见到一些潜在的问题,这些都是真正的问题.
对于已经在每个可交付产品中使用一个解决方案的环境中工作的任何人,将通用组件作为多个解决方案中包含的项目:您是否遇到过此类配置的任何重大缺陷?
我将Jenkins与Xcode插件配置为通过将测试构建操作添加到Custom xcodebuild参数设置来运行单元测试.有关让Jenkins使用Xcode 5运行单元测试的更多信息,请参阅此问题.
现在我已经运行了,它似乎将NSLog语句的控制台输出或最终** TEST SUCCEEDED **
消息与测试结果混合在一起,因此偶尔会将解码器绊倒,将单元测试结果转换为Jenkins所需的JUnit格式.
例如,Jenkins日志显示如下输出:
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsNotZero]' passed (** TEST SUCCEEDED **
0.000 seconds).
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsZero]' started.
Run Code Online (Sandbox Code Playgroud)
什么时候它应该是:
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsNotZero]' passed (0.000 seconds).
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsZero]' started.
** TEST SUCCEEDED **
Run Code Online (Sandbox Code Playgroud)
我进一步调查了这一点,并把詹金斯拉出了画面.如果我在命令提示符下直接运行xcodebuild命令:
xcodebuild \
-workspace project.xcworkspace \
-scheme Tests \
-configuration Release \
-sdk iphonesimulator7.0 \
-destination "platform=iOS Simulator,name=iPhone Retina (4-inch),OS=latest" \
test
Run Code Online (Sandbox Code Playgroud)
输出总是很好,有序.
但是,如果我将输出传递给另一个程序或重定向到文件:
xcodebuild \
-workspace project.xcworkspace \
-scheme Tests \
-configuration Release \ …
Run Code Online (Sandbox Code Playgroud) 我们一直在使用Jenkins和Xcode插件来运行iOS应用程序的持续集成,包括自动执行和单元测试报告.这在Linux机器和运行Xcode 4.6.3的Mac从机上使用Jenkins运行良好.
现在我们正在寻求将设置更新为Xcode 5以支持目标iOS 7并遇到以下问题.
首先,单元测试根本不会运行,因为我们正在使用Xcode 4中不再受Xcode 4支持的RunUnitTests脚本.我按照Xcode的建议解决了这个问题,通过使用适当的方案设置工作区.测试目标.
然后我配置了Jenkins作业的Xcode步骤,并设置了自定义xcodebuild参数,test -destination platform=${DESTINATION_PLATFORM},name=${DESTINATION_NAME},OS=${DESTINATION_OS}
以使其运行单元测试.
如果我运行xcodebuild命令行,Jenkins的Xcode插件在我自己的机器上的Terminal中运行,则单元测试运行,但是当Jenkins作业运行时,它会在尝试运行单元测试时失败或挂起.
我怀疑这是因为使用Xcode 5和测试buildaction而不是RunUnitTests脚本,单元测试现在在iOS模拟器中运行,这需要交互式会话,并且Jenkins从属进程正在通过Jenkins大师(Linux)的SSH运行.如果我使用Jenkins用于SSH的帐户登录到从属计算机,我可以看到iOS模拟器在单元测试运行时启动,但测试似乎没有运行且作业挂起.如果我没有登录到从机,则Jenkins作业无法运行单元测试.
有没有办法让iOS单元测试通过SSH在Jenkins从站上运行,如果没有,任何关于如何在项目必须使用Xcode 5构建时自动执行单元测试的建议?
我希望在iOS 4及更高版本的iOS应用程序中使用MD5或SHA-1.我使用CommonCrypto/CommonDigest.h中的CC_MD5()和CC_SHA1()函数.它似乎在运行iOS 4.1和iPhone 4.0模拟器的iPhone上运行良好,但我很担心,因为XCode 4.2附带的iOS 5 SDK中的函数声明如下:
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_5_0);
extern unsigned char *CC_SHA1(const void *data, CC_LONG len, unsigned char *md)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_5_0);
Run Code Online (Sandbox Code Playgroud)
这似乎表明这些功能仅适用于iOS 5及更高版本.
这些功能是否允许在iOS 4应用程序中使用,如果是这样,是否有任何官方参考来记录这一事实?
我读到的关于在多个线程上使用Core Data的所有内容都谈到了使用NSManagedObjectContext
共享单个实例的多个实例NSPersistentStoreCoordinator
.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用Core Data来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.
问题是对底层SQLite持久性存储的访问是由序列化的NSPersistentStoreCoordinator
,因此仍然存在UI被后台提取操作阻止的情况.
后台获取操作永远不会更新数据,只能从中读取数据.我可以在连接到同一底层SQLite持久存储的后台线程上设置一个完全并行的Core Data堆栈(NSManagedObjectContext
,NSManagedPersistentStoreCoordinator
和NSManagedObjectModel
)吗?看起来这样可以在UI线程和后台获取操作之间提供完全的并发性.
我正在尝试使用http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/中-[NSObject autoContentAccessingProxy]
所述的内容.NSObject/autoContentAccessingProxy.
我试图代理的对象实现NSDiscardableContent
协议并-autoContentAccessingProxy
成功返回非零值.
但是,如果我尝试向代理发送消息,我总是得到一个NSInvalidArgumentException
"*** - [NSProxy methodSignatureForSelector:]调用!"的原因.
我理解如果我正在编写自己NSProxy
的类,我将不得不实现该-methodSignatureForSelector:
方法,但在这种情况下,我不是在编写代理,只是尝试使用文档化方法提供的代理.对于它的价值,我可以看到代理实际上是类型NSAutoContentAccessingProxy
,所以我希望该类确实有一个实现-methodSignatureForSelector:
.
这是使用NSPurgeableData实例而不是我的自定义类的一小段代码.这个小块有完全相同的问题.
NSPurgeableData * data = [NSPurgeableData dataWithBytes:"123" length:3];
NSLog(@"data.length = %u", data.length);
id proxyData = [data autoContentAccessingProxy];
NSLog(@"proxyData.length = %u", [proxyData length]); // throws NSInvalidArgumentException!
[data endContentAccess];
[data release];
Run Code Online (Sandbox Code Playgroud)
我在-autoContentAccessingProxy
这里对这种方法有一些误解,还是只是完全被打破了?
根据MSDN,
[管道名称]必须具有以下形式:
\\.\pipe\pipename
名称的pipename部分可以包括反斜杠以外的任何字符,包括数字和特殊字符.整个管道名称字符串最长可达256个字符.管道名称不区分大小写.
但是有很多例子我在其中看到了带有反斜杠的命名管道名称.例如,SQL Server的标准管道名称是\\.\pipe\sql\query
.
从SysInternals运行PipeList会在我的机器上显示大量管道,其名称包含反斜杠.
那么,管道名称中是否有反斜杠?
我问,因为我正在创建一个具有多个管道的服务,其名称如下:
\\.\pipe\MyApp
\\.\pipe\MyApp\0
\\.\pipe\MyApp\1
\\.\pipe\MyApp\2
Run Code Online (Sandbox Code Playgroud)
创建第一个管道后,创建其他管道将失败并出现Windows错误123(ERROR_INVALID_NAME).如果我跳过创建第一个管道,所有其他的,名称中使用反斜杠字符,将会正常工作.
管道似乎是分层的,就像文件系统一样,如果你有一个具有特定名称的管道,那么该名称就不能再用作其他管道的"文件夹"或容器.
当试图解决这个问题时,我遇到了MSDN文章,现在正在质疑我是否应该使用反斜杠.
有什么建议?
从文档Image.FromHbitmap()
的http://msdn.microsoft.com/en-us/library/k061we7x%28VS.80%29.aspx:
FromHbitmap方法制作GDI位图的副本; 因此,您可以在创建新图像后立即使用GDIDeleteObject方法释放传入的GDI位图.
这非常明确地说明,一旦创建了Bitmap实例,就可以使用DeleteObject立即删除位图句柄.
Image.FromHbitmap()
然而,看看使用Reflector 的实现,它表明它是围绕GDI +函数的一个非常薄的包装器GdipCreateBitmapFromHBITMAP()
.
有对GDI +平板API函数相当稀少的文档,但http://msdn.microsoft.com/en-us/library/ms533971%28VS.85%29.aspx表示,GdipCreateBitmapFromHBITMAP()
对应于Bitmap::Bitmap()
接受一个构造函数HBITMAP
和HPALETTE
作为参数.
http://msdn.microsoft.com/en-us/library/ms536314%28VS.85%29.aspx上此版本Bitmap::Bitmap()
构造函数的文档有这样的说法:
您负责删除GDI位图和GDI调色板.但是,在删除GDI + Bitmap :: Bitmap对象或超出范围之前,不应删除GDI位图或GDI调色板.
不要将GDI位图或位图构造函数传递给当前(或以前)选择到设备上下文中的GDI位图或GDI调色板.
此外,可以在源代码中看到GdiPlusBitmap.h中GDI +的C++部分,所讨论的Bitmap::Bitmap()
构造函数本身就是GdipCreateBitmapFromHBITMAP()
来自平面API 的函数的包装器:
inline
Bitmap::Bitmap(
IN HBITMAP hbm,
IN HPALETTE hpal
)
{
GpBitmap *bitmap = NULL;
lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
SetNativeImage(bitmap);
}
Run Code Online (Sandbox Code Playgroud)
我不能轻易看到的是GdipCreateBitmapFromHBITMAP()
这个功能的核心实现,但文档中的两个评论似乎是矛盾的..Net文档说我可以立即删除位图句柄,并且GDI +文档说必须保留位图句柄,直到删除包装对象,但两者都基于相同的GDI +函数.
此外,GDI +文档警告不要使用当前或之前选择到设备上下文中的源HBITMAP.虽然我可以理解为什么当前不应该将位图选择到设备上下文中,但我不明白为什么会出现使用先前选择到设备上下文中的位图的警告.这似乎会阻止使用标准GDI在内存中创建的GDI +位图.
所以,总结一下:
GdipCreateBitmapFromHBITMAP()
是复制源位图还是只保留原始句柄?我正在尝试创建一个使用speed
0.0 的交互式动画,并操纵该timeOffset
属性以响应用户操作.我希望动画的初始状态位于定义动画中间的某个位置,因为用户动作允许动画从起点向前和向后进行.
下面是一些示例代码,它是我尝试做的简化案例.
@interface TestViewController : UIViewController {}
@property (strong, nonatomic) IBOutlet UIView * transformerView;
@property (strong, nonatomic) IBOutlet UISlider * slider;
@end
@implementation TCTestViewController {}
- (void)viewDidLoad {
[super viewDidLoad];
self.slider.minimumValue = 0.0f;
self.slider.maximumValue = 1.0f;
self.slider.value = 0.5f;
CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-320.0f, 0.0f, 0.0f)];
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(320.0f, 0.0f, 0.0f)];
animation.duration = 1.0f;
self.transformerView.layer.speed = 0.0;
[self.transformerView.layer addAnimation:animation forKey:@"test"];
// *** THIS IS THE PROBLEM LINE ***
self.transformerView.layer.timeOffset …
Run Code Online (Sandbox Code Playgroud) 我有一个UITableView,当表中没有足够的单元格来保证滚动时,我不想跳动。因此,我设置-bounces
为是和-alwaysBounceVertical
否。
我尝试使用“弹跳”和“垂直弹跳”复选框通过IB设置这些属性,但似乎无论我在IB中将“垂直弹跳”属性设置为什么,在运行时始终为YES。
我更希望能够使用IB完全配置它,而不需要使用代码设置属性。有谁知道为什么这不起作用?
ios ×8
objective-c ×2
unit-testing ×2
xcode ×2
.net ×1
asp.net-mvc ×1
cocoa-touch ×1
commoncrypto ×1
core-data ×1
gdi+ ×1
ios4 ×1
jenkins ×1
named-pipes ×1
pipe ×1
uitableview ×1
viewbag ×1
winapi ×1
windows ×1
xcode5 ×1
xcodebuild ×1