小编Gam*_*Dev的帖子

如何手动更改 UIMenu 中选定的 UIAction?

目标: 尝试创建一个过滤器选择屏幕(在卡片视图中),其中包含带有 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)

xcode ios swift uimenu uiaction

8
推荐指数
1
解决办法
5929
查看次数

使用NSURLSession进行OCMock单元测试

我有一个名为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)

我需要为此创建一个单元测试,它执行以下操作:

  • NSURLSession dataTaskWithRequest:completionHandler:响应被模拟为包含我有的假JSON数据:

//预期的JSON响应

NSData *jsonResponse = [self sampleJSONData];
Run Code Online (Sandbox Code Playgroud)
  • 公共方法downloadDataWithURLString:completionHandler:response返回的数组应包含所有相册和nil错误.

要记住的其他要点是我需要使用假的JSON数据"jsonResponse"将NSURLSession模拟到downloadDataWithURLString:completionHandler:方法,而不调用实际的网络请求.

我尝试了各种不同的东西,但我无法解决这个问题,我认为这是伪造请求和块的组合,这让我很困惑.

这是我试过的两个测试方法的例子(我实际上尝试了很多其他的方法,但这就是我现在剩下的):

- (void)testValidJSONResponseGivesAlbumsAndNilError …
Run Code Online (Sandbox Code Playgroud)

unit-testing objective-c ocmock stubs nsurlsession

5
推荐指数
1
解决办法
1276
查看次数

使用 UIImageView 在 UIView 中切透明孔

我正在尝试为我的 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)

uiimageview cgpath ios uibezierpath swift

3
推荐指数
1
解决办法
3053
查看次数

如何在编辑时将图像叠加添加到UIImagePickerControllerSourceTypePhotoLibrary?

我已经尝试到处寻找答案,但找不到任何有用的信息.

基本上,我希望用户从相册中选择一张图片,然后让应用程序以编辑/裁剪模式显示图片.

在这个编辑屏幕上,我想显示一个覆盖屏幕供用户用来对齐他的图像.

然后,他单击保存按钮,通过合并图像将已编辑的图片与覆盖图像一起保存.

我唯一无法找到的方法是在编辑屏幕中添加叠加图像!

我可以很容易地做到这一点:

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)

iphone uiimagepickercontroller ios

2
推荐指数
1
解决办法
7552
查看次数

mapView不使用didUpdateUserLocation进行第二次尝试

我正在从我的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方法!因此,地图视图缩小到默认值,并且不会像以前那样放大.

我怎样才能让它再次被召唤?

谢谢

mkmapview ios android-mapview

2
推荐指数
1
解决办法
2685
查看次数