小编Pet*_*erD的帖子

更改UILabel文本但保留其余属性

我在使用故事板创建的ViewController中有一个UILabel.标签文本的字体,大小和颜色,它的对齐方式 - 都在故事板中设置.故事板中的标签连接到我的文件中名为p_patientNameLbl的插座.

现在我试图以编程方式更改标签的文本,如下所示:

[self.p_patientNameLbl setText:@"Vasya"];
Run Code Online (Sandbox Code Playgroud)

我没看到新文本,直到我意识到故事板中的原始标签在黑色背景上是白色的,但显然在我更改了上面的标签文本之后,所有字体属性都已重置,现在它是一个黑色文本黑色背景,因此没见过.一旦我以编程方式设置颜色:

[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];
Run Code Online (Sandbox Code Playgroud)

我可以看到新标签,但所有其余的字体属性和对齐仍然是错误的.

有没有办法更改标签的文本,而无需以编程方式设置所有其余的属性?我想有必须有办法,因为我不想在代码中格式化我的界面!

objective-c uilabel ios

13
推荐指数
3
解决办法
2万
查看次数

NSInputStream停止运行,有时会抛出EXC_BAD_ACCESS

(更新)这是一个问题简而言之:在iOS中我想读取一个大文件,对它进行一些处理(在这种特殊情况下编码为Base64 string()并保存到设备上的临时文件.我设置一个NSInputStream从文件读取,然后在

(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
Run Code Online (Sandbox Code Playgroud)

我正在完成大部分工作.出于某种原因,有时我可以看到NSInputStream停止工作.我知道因为我有一条线

NSLog(@"stream %@ got event %x", stream, (unsigned)eventCode);
Run Code Online (Sandbox Code Playgroud)

在开始时(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode,有时我会看到输出

stream <__NSCFInputStream: 0x1f020b00> got event 2
Run Code Online (Sandbox Code Playgroud)

(对应于事件NSStreamEventHasBytesAvailable)然后没有任何事情.不是事件10,它对应于NSStreamEventEndEncountered,不是错误事件,什么都没有!而且有时甚至我得到一个EXC_BAD_ACCESS异常,我现在不知道如何调试.任何帮助,将不胜感激.

这是实施.当我点击"提交"按钮时,一切都会开始,这会触发:

- (IBAction)submit:(id)sender {     
    [p_spinner startAnimating];    
    [self performSelector: @selector(sendData)
           withObject: nil
           afterDelay: 0];   
}
Run Code Online (Sandbox Code Playgroud)

这是sendData:

-(void)sendData{
    ...
    _tempFilePath = ... ;
    [[NSFileManager defaultManager] createFileAtPath:_tempFilePath contents:nil attributes:nil];
    [self setUpStreamsForInputFile: [self.p_mediaURL path] outputFile:_tempFilePath];
    [p_spinner stopAnimating];
    //Pop back to previous VC
    [self.navigationController popViewControllerAnimated:NO] ;
}
Run Code Online (Sandbox Code Playgroud)

这是上面调用的setUpStreamsForInputFile:

- (void)setUpStreamsForInputFile:(NSString *)inpath outputFile:(NSString *)outpath  {
    self.p_iStream = [[NSInputStream alloc] initWithFileAtPath:inpath]; …
Run Code Online (Sandbox Code Playgroud)

objective-c nsinputstream grand-central-dispatch ios

12
推荐指数
2
解决办法
7625
查看次数

入队到NSInputStream?

我想在NSInputStream中添加三个"部分":NSString,另一个流的输出,然后是另一个NSString.这个想法如下:

第一个和最后一个NSStrings表示SOAP请求的开始和结束,而流的输出是加载非常大的文件并将其编码为Base64字符串的结果.所以,最后我会让最终的NSInputStream像这样保存整个SOAP请求:

<soap beginning> <Base64编码数据> <soap结束>

我希望整个请求保存在NSInputStream中的原因有两个:

  1. 我不知道如何将非常大的数据文件加载到内存中
  2. 我认为这是强制在HTTP 1.1块中发送最终请求的唯一方法(我需要它,否则,如果请求变得太大,服务器将不接受它).所以,我知道这样做:

    NSInputStream *dataStream = ....; 
    [request setHTTPBodyStream:dataStream];
    
    Run Code Online (Sandbox Code Playgroud)

确保请求将作为HTTP 1.1块发送,而不是作为一个巨大的原始SOAP请求发送.

所以,我想知道如何实现这一点 - 即,我如何将事物"排入"NSInputStream?甚至可以做到吗?还有另一种方法吗?

仅供参考,在Java中可以如下完成

 Vector<InputStream> streamVec = new Vector<InputStream>();
 BufferedInputStream fStream = new BufferedInputStream(fileData.getInputStream());
 Base64InputStream b64stream = new Base64InputStream(fStream, true);
 String[] SOAPBody = GenerateSOAPBody(fileInfo).split("CUT_HERE");  
 streamVec.add(new ByteArrayInputStream(SOAPBody[0].getBytes()));
 streamVec.add(b64stream);
 streamVec.add(new ByteArrayInputStream(SOAPBody[1].getBytes()));
 SequenceInputStream seqStream = new SequenceInputStream(streamVec.elements());
Run Code Online (Sandbox Code Playgroud)

因为Java有这些对象可用,但Objective-c中的NSStreams看起来像非常低级别的对象,并且很难使用.

注意:我完全重写了原始问题,因为我在2天前问过它,因为我认为新编辑更清楚地解释了问题所在.我希望这将有助于它更容易理解,也许可以回答

更新2

以下是我迄今为止所能实现的目标:我使用临时文件首先编写<soap beginning>,然后设置输入流来从文件中读取,而不是尝试排入流中.块,将每个块编码为Base64字符串并将其写入相同的临时文件,最后,当我的流关闭时,我将<soap ending>写入临时文件.然后我设置另一个输入流与该文件的内容,我传递给NSMutableURLRequest:

        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
        ...
        NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
        [request setHTTPBodyStream:dataStream];
Run Code Online (Sandbox Code Playgroud)

这确保了HTTP 1.1分块传输文件的内容.连接完成后,删除临时文件.

这似乎工作正常,但当然这是一个烦人的工作.我不想写一个临时文件,当它可以由流处理(理想情况下).如果有人仍有更​​好的建议,请告诉我:)

更新3

好的,另一个更新是有序的.虽然我的文件写入似乎有效,但我现在遇到了一些意外问题,我的一些请求无法上传到服务器.具体来说,一切都按照计划进行,我正在将临时文件的内容读入流中,并将我的请求的HTTP主体设置为此流,并开始按我的意愿传输HTTP 1.1块 - 但对于某些一些数据包丢失的原因和最后的请求 - …

nsinputstream nsstream ios

9
推荐指数
1
解决办法
572
查看次数

在Objective-C中发送分块的HTTP 1.1请求

我有以下问题:我正在创建一个非常大的SOAP请求(数据是一个编码为Base64字符串的视频),因此我不能将其作为原始SOAP请求发送,而是需要在HTTP 1.1块中发送它.我似乎无法弄明白该怎么做.我在这里使用了代码: 对于分块传输编码,NSURLConnection的替代方法是什么, 但它似乎没有做我认为应该做的事情 - 我可以看到请求作为单个请求而不是许多块到达服务器上(我在服务器上使用WireShark来查看传入的流量.)

我知道Android上的类似功能使用Apache Foundations HTTP库进行Java工作 - 有了这些,任何预先未指定长度的HTTP请求都会作为HTTP 1.1 Chunked Request传输 - 我可以看到这些请求到达了服务器作为单独的块...我想模仿它.

(更新:似乎我AFNetworking可能有功能,但我没有找到任何关于如何使用它的例子.)

这是我的代码,或多或少:

NSString *soapBody = ....; //some correctly formed SOAP request XML here 


NSURL *url = [NSURL URLWithString:...];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
[request addValue: ... forHTTPHeaderField:@"SOAPAction"];
[request setHTTPMethod:@"POST"];
[request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];
ChunkedTransferConnection* connection = [ChunkedTransferConnection alloc];
[connection establishConnectionWithRequest:request];
Run Code Online (Sandbox Code Playgroud)

ChunkedTransferConnection的实现如下

@implementation ChunkedTransferConnection

    @synthesize p_connection;
    @synthesize p_responseData;

    - (void)establishConnectionWithRequest:(NSMutableURLRequest *)request
    {
        self.p_responseData = [[NSMutableData alloc] initWithLength:0] ;
        self.p_connection = [[NSURLConnection …
Run Code Online (Sandbox Code Playgroud)

soap objective-c nsurlconnection ios http-chunked

7
推荐指数
1
解决办法
2857
查看次数