目标: 尝试创建一个过滤器选择屏幕(在卡片视图中),其中包含带有 UIMenu 项目的 UIButtons。当我选择任何过滤器并单击“应用过滤器”按钮时,我会关闭过滤器视图控制器并返回到集合视图屏幕以使用所选过滤器刷新数据。
问题: 在已选择过滤器的情况下,当我想再次返回以更改任何过滤器时,我单击过滤器按钮以打开过滤器视图控制器,但显然没有保留任何 UIMenu 选择,因为它们首先重置为默认值索引设置。
如何解决?: 当我的数据从filterVC传回主列表屏幕时,我传递了所选UIMenu的标题。我想我可以将其传递回filterVC并将菜单默认为传入的数据(即可以搜索标题并使其成为UIMenu中选定的UIAction),但是我似乎找不到一种方法手动选择哪个 UIAction 应该是 UIMenu 的选定状态!
var spaceTypeMenu: UIMenu {
return UIMenu(title: "Space Type", image: nil, identifier: nil, options: [], children: spaceTypeMenuItems)
}
private var spaceTypeMenuItems: [UIAction] {
return [
UIAction(title: "All", handler: { (_) in }),
UIAction(title: "Meeting Room", handler: { (_) in }),
UIAction(title: "Desk", handler: { (_) in }),
UIAction(title: "Boardroom", handler: { (_) in })
]
}
Run Code Online (Sandbox Code Playgroud)
然后下面是从viewdidload()中调用的
func createSpaceTypeMenu() {
spaceTypeButton?.menu = spaceTypeMenu
spaceTypeButton?.showsMenuAsPrimaryAction = true …Run Code Online (Sandbox Code Playgroud) 我有一个名为ITunesAlbumDataDownloader的网络类
@implementation AlbumDataDownloader
- (void)downloadDataWithURLString:(NSString *)urlString
completionHandler:(void (^)(NSArray *, NSError *))completionHandler
{
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
NSArray *albumsArray = [self parseJSONData:data];
completionHandler(albumsArray, error);
}];
[dataTask resume];
}
- (NSArray *)parseJSONData:(NSData *)data {
NSMutableArray *albums = [[NSMutableArray alloc] init];
...
...
// Return the array
return [NSArray arrayWithArray:albums];
}
@end
Run Code Online (Sandbox Code Playgroud)
我需要为此创建一个单元测试,它执行以下操作:
//预期的JSON响应
NSData *jsonResponse = [self sampleJSONData];
Run Code Online (Sandbox Code Playgroud)
要记住的其他要点是我需要使用假的JSON数据"jsonResponse"将NSURLSession模拟到downloadDataWithURLString:completionHandler:方法,而不调用实际的网络请求.
我尝试了各种不同的东西,但我无法解决这个问题,我认为这是伪造请求和块的组合,这让我很困惑.
这是我试过的两个测试方法的例子(我实际上尝试了很多其他的方法,但这就是我现在剩下的):
- (void)testValidJSONResponseGivesAlbumsAndNilError …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的 QR 相机视图创建下面的图像。
我有一个相机覆盖图像(屏幕中间的正方形)。
我在 stackoverflow 上查看了类似的主题,并找到了如何从黑色背景(0.75% 透明)中剪切出相机覆盖图像,以便在中间留下空白空间,但是我在其放置方面遇到了一些实际问题,我不知道什么行为如此奇怪。
这是我用来创建背景黑色图像并剪掉中心正方形的代码:
// Create a view filling the screen.
let backgroundView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
// Set a semi-transparent, black background.
backgroundView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75)
// Create the initial layer from the view bounds.
let maskLayer = CAShapeLayer()
maskLayer.frame = backgroundView.bounds
maskLayer.fillColor = UIColor.black.cgColor
// Create the path.
let path = UIBezierPath(rect: backgroundView.bounds)
maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
// Append the overlay image …Run Code Online (Sandbox Code Playgroud) 我已经尝试到处寻找答案,但找不到任何有用的信息.
基本上,我希望用户从相册中选择一张图片,然后让应用程序以编辑/裁剪模式显示图片.
在这个编辑屏幕上,我想显示一个覆盖屏幕供用户用来对齐他的图像.
然后,他单击保存按钮,通过合并图像将已编辑的图片与覆盖图像一起保存.
我唯一无法找到的方法是在编辑屏幕中添加叠加图像!
我可以很容易地做到这一点:
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
但当:
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
我不能用:
imagePicker.cameraOverlayView = overlayGraphicView;
那是我的问题.
此外,如果我将UIimage添加为子视图而不是此叠加层,即使用户从相册中选择了他的图像,它也会保留在屏幕上.我只希望在选择编辑图像之后以及在编辑完成后将图像保存到相册之前显示叠加层.
谢谢你的帮助.
继承人的方法:
- (IBAction)pickPhotoButton:(id)sender {
NSLog(@"Pick a Current Photo Button Pressed...");
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// Delegate is self
imagePicker.delegate = self;
// Allow editing of image ?
imagePicker.allowsEditing = YES;
// Show image picker
[self presentModalViewController:imagePicker animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
并且我的保存到相册方法:
// Save the image to …Run Code Online (Sandbox Code Playgroud) 我正在从我的mainviewcontroller按下视图贴图按钮时加载mapviewcontroller:
- (IBAction)mapButton:(id)sender {
MapKitDisplayViewController *mapKitDisplayView = [[MapKitDisplayViewController alloc] init];
[self presentModalViewController:mapKitDisplayView animated:YES];
[mapKitDisplayView release]; mapKitDisplayView = nil;
}
Run Code Online (Sandbox Code Playgroud)
在启动此地图视图时,将调用此方法,该方法可正确缩放到用户位置:
- (void)mapView:(MKMapView *)myMapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
myMapView.showsUserLocation = YES;
NSLog(@"didUpdateUserLocation = '%@'", userLocation);
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([userLocation coordinate], 20000, 20000);
[myMapView setRegion:region animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
我在这个屏幕上有一个完成按钮,可以解除这个视图:
- (IBAction)mapDoneButton:(id)sender
{
[self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
在此阶段,用户将被带回主视图控制器,但是当我再次按下视图映射按钮时,永远不会调用didUpdateUserLocation方法!因此,地图视图缩小到默认值,并且不会像以前那样放大.
我怎样才能让它再次被召唤?
谢谢
ios ×4
swift ×2
cgpath ×1
iphone ×1
mkmapview ×1
nsurlsession ×1
objective-c ×1
ocmock ×1
stubs ×1
uiaction ×1
uibezierpath ×1
uiimageview ×1
uimenu ×1
unit-testing ×1
xcode ×1